首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL主键优化原理篇——【数据组织方式&主键顺序插入主键乱序插入&页分裂&页分裂】

前言 大家好吖,欢迎来到 YY 滴MySQL系列 ,热烈欢迎!...本章主要内容面向接触过C++ Linux的老铁 主要内容含: 一.主键优化 1.主键设计原则 满足业务需求的情况下, 尽量降低主键的长度。...插入数据时,尽量选择 顺序插入 ,选择使用AUTOINCREMENT自增主 顺序插入可以减少 页分裂 (可以了解下按下面的数据组织方式) 2.数据组织方式 【1】主键顺序插入 在大多数数据库系统中,如表数据是使用...主键顺序插入 第一个页满了,插入第二个页,一页16k,以此类推 【2】页分裂(主键乱序插入) 下面演示页分裂: 此时两页都满了, 我们要插入id为50的数据 ,他会开辟一个新的数据页,但并不是直接插入到第三个数据页当中...找到第一个 数据页百分之50的位置 ,大于百分之50的部分移动的新开辟的数据页当中 之后插入id为50的数据 插入要进入的50数据时,此时就应该改动链表指针 【3】页合并(主键乱序删除) 当删除一行记录时

5310
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【MyBatis框架点滴】——mybatis插入数据返回主键mysql、oracle)

    主键的值都是插入之前无法知道的,但很多情况下我们在插入数据后需要使用刚刚插入数据的主键,比如向两张关联表A、B中插入数据(A的主键是B的外键),向A表中插入数据之后,向B表中插入数据时需要用到A的主键。...id }   这里总结一下mybatis插入数据时返回主键的4种情况:mysql环境下主键自增、mysql环境下主键为uuid、mysql环境下主键自增、mysql环境下主键为uuid。   ...数据库为mysql ---- 主键为自增时(主键为数值类型且自增)   利用mysql的LAST_INSERT_ID()方法获取插入记录的主键,select LAST_INSERT_ID()可以在插入数据后...主键为UUID时(主键必须为字符类型)   使用mysql的方法UUID()方法获取随机的UUID作为主键,select UUID()可以在插入数据前,生成随机的UUID并通过keyProperty赋值给将要插入记录的主键...背 景数据库为oracle: 主键为自增时(主键为数值类型):   在oracle中实现主键自增,需要先创建序列,相当于创建一个全局变量,用来存储对应表的主键的当前最大值(主键为数值类型时)。

    2K20

    mysql 联合主键_Mysql 创建联合主键

    Mysql 创建联合主键 2008年01月11日 星期五 下午 5:21 使用primary key (fieldlist) 比如: create table mytable ( aa int, bb...char(8), cc date, primary key (aa,bb ) ); aa,bb为联合主键 不知道是不是因为mysql(6.0)的版本问题,还是各版本都是这种情况,mysql中创建联合主键...TABLE t1( id … MySQL创建双主键 如下: CREATE TABLE `loginlog` ( `id` ) unsigned zerofill NOT NULL AUTO_INCREMENT...COMMENT ‘主键编号’, `IP` … mysql修改联合主键 参考 https://blog.csdn.net/BockSong/article/details/80933477 alter...涉及的知识点总结如下: One to One 映射关系 一对一单向外键(XML/Annotation) 一对一双向外键关联(XML/A … SQL Server中的联合主键、聚集索引、非聚集索引、mysql

    8.3K20

    MySQL进阶学习之SQL优化【插入主键,排序,分组,分页,计数】

    主键乱序插入 : 8 1 9 21 88 2 4 15 89 5 7 3 ​ 主键顺序插入 : 1 2 3 4 5 7 8 9 15 21 88 89 大批量插入数据 如果一次性需要插入大批量数据...(比如: 几百万的记录),使用insert语句插入性能较低,此时可以使用MySQL数据库提供的load指令进行插入。...注:在load时,主键顺序插入性能高于乱序插入 2、主键优化 2.1 数据组织方式 在InnoDB存储引擎中,表数据都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized...1、主键顺序插入效果 从磁盘中申请页,主键顺序插入,当第一页数据写满之后,再写入第二个页,页和页之间通过指针连接,第二页写满之后,再往第三页写入,以此类推。...2.4 主键设计原则 满足业务需求的情况下,尽量降低主键的长度。 插入数据时,尽量选择顺序插入,选择使用AUTO_INCREMENT自增主键

    2.2K30

    mysql数据库中int类型的最大值_mysql自增主键最大

    1、mysql中int(11)中的11代表显示宽度 整数列的显示宽度,与mysql需要用多少个字符来显示该列数值,与该整数需要的存储空间的大小都没有关系。...a、int是整型,(11)是指显示字符的宽度,最大为255。 b、int(11)是记录行数的id,插入10条记录,那么它就显示00000000001 ~~~00000000010。...e、如果没有给它指定显示宽度,MySQL会为它指定一个默认值。显示宽度只用于显示,并不能限制取值范围和占用空间。...f、INT(3)会占用4个字节的存储空间,并且允许的最大值也不会是999,而是INT整型所允许的最大值。...2、mysql有五种整型数据列类型,即TINYINT,SMALLINT,MEDIUMINT,INT和BIGINT。 a、区别是取值范围不同,存储空间不相同。

    6.1K20

    mysql 主键自增语句_MySQL 自增主键

    连续性 插入成功时,其数据的 ID 和前一次插入成功时数据的 ID 相邻。 自增主键的单调性 为何会有单调性的问题? 这主要跟自增主键最大值的获取方式,以及存放位置有关系。...如果最大值是通过计算获取的,并且在某些情况下需要重新获取时,会因为最新的数据被删除而减小。 自增主键最大值怎么取的?存放到哪里?...MySQL 5.7 及之前的版本,自增主键最大值会在启动(重启)后从数据库中取出放到内存: SELECT MAX(ai_col) FROM table_name FOR UPDATE; 这样获取是通过计算的...从 MySQL 8.0 开始,自增主键最大值会在每次修改后写入到 redo log,并且在每个检查点写入引擎私有的系统表。 如果是正常重启,则读取系统表里的值。...参考文档 为什么 MySQL 的自增主键不单调也不连续 https://database.51cto.com/art/202004/614923.htm 《MySQL技术内幕——InnoDB存储引擎》

    10.8K10

    Mysql资料 主键

    表中的任何列都可以作为主键,只要它满足以下条件: 1、任何两行都不具有相同的主键值 2、每个行都必须具有一个主键值(主键列不允许NULL值) 除MySQL强制实施的规则外,应该坚持的几个普遍认为的最好习惯为...这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放,因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15.../16),则开辟一个新的页(节点) 1.如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。...2、.如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置: 此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉...如果没有显式地在表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID,并一次作为主键mysql 在频繁的更新、删除操作,会产生碎片。而含碎片比较大的表,查询效率会降低。

    3.8K20

    Navicat数据同步,主键重复无法插入

    基础知识 Navicat是一个非常好用的可视化mysql管理软件(其他数据库也有对应版本的支持) 它拥有非常丰富的功能,结构同步、数据同步、数据传输、进程监控、数据导出导入等等 但这是一个付费软件,新用户可以免费试用...在使用数据同步的时候,能筛选出不同数据,但是却不能运行,因为筛选出的数据主键在第二个数据库中已经被占用。...主键id重复,自然就会产生失败了 问题怎么解决 因为我这里需要处理的数据量比较小 我这里采用的是比较直接的方法,如果有更好的方式,请大家在评论中留言,一起探讨 在A中筛选出差异数据(可以根据软件或者其他筛选条件等...json文件上传到B机器中,写一个脚本,读取json 并且删除id主键,重新生成insert语句 $data = file_get_contents("....data as $key => $value){ unset($value['id']); $sql = "INSERT xxx " . array_to_sql($value); mysql_query

    2.8K20

    mysql主键自增策略_MySQL 自增主键机制

    自增主键:特指在自增列上定义的主键。 自增主键的优点是让主键索引保持递增顺序的插入,避免页分裂,索引更加紧凑。 1. 自增值保存在哪? 不同的存储引擎保存自增值的策略不一样; a....Innodb引擎,mysql5.7之前,自增值保存在内存中,而且不会持久化自增值。...每次重启后第一次打开表,都会去查找自增值的最大值max(id), 并设置表当前自增值为max(id) + 1; mysql8.0, 自增值变更记录在了redo log中,重启时依靠redo log恢复重启之前的值...自增值修改发生在插入数据的操作之前,如果插入失败,自增值不会再修改回去; b. 事务回滚也不会将自增值修改回去; c. 为了减少自增id锁带来的性能影响,mysql不会修改回去之前的自增值; 4....而对于批量插入数据的语句(select … insert,replace … select 和 load data 语句),MySQL 有一个批量申请自增 id 的策略(注:该策略是导致自增 id 不连续的第三种原因

    9.4K50

    MySQL主键设计盘点

    主键设计和应用原则 除了满足MySQL强制实施的规则(主键不可重复;一行中主键不可为空)之外,主键的设计和应用应当还遵守以下公认的原则: 不更新主键列中的值; 不重用主键列的值; 不在主键列中使用可能会更改的值...3、ID作为主键时在特定的环境会存在一些问题,比如需要排序的时候——UUID是无序的。 4、MySQL官方有明确的建议主键要尽量越短越好,36个字符长度的UUID不符合要求。...5、对MySQL索引不利:作为数据库主键,在InnoDB引擎下,UUID的无序性可能会引起数据位置频繁变动,严重影响性能。...关于MySQL 使用自增ID主键和UUID 作为主键的性能比较可以查看参考【8】。 结论: 1、uuid做主键适用于小规模分布式架构用。...结论: 用自建的id生成器做主键适用于大规模分布式架构 参考: 【1】:红心李 :MySQL主键设计 【2】:Uncle Nucky :MySQL数据库主键设计原则 【3】:ellis:设计套路:Mysql

    4.2K30

    MySQL主键详解

    表中的任何列都可以作为主键,只要它满足以下主键值规则条件: 任两行不具相同的主键值 每行都必须具有一个主键值(主键列不允许NULL) 这里的规则是MySQL本身强制实施的。...除MySQL强制实施的规则外,还应该坚持的最佳实践: 不更新主键列中的值 不重用主键列的值 不在主键列中使用可能会更改的值 例如,如果使用一个名字作为主键以标识某个供应商,当该供应商合并和更改其 名字时...,必须更改这个主键) 联合主键 好处 可以直观的看到某个重复字段的记录条数 主键A跟主键B组成联合主键 主键A跟主键B的数据可以完全相同,联合就在于主键A跟主键B形成的联合主键是唯一的。...联合主键体现在多个表上,复合主键体现在一个表中的多个字段。 复合主键 主键通常定义在表的一列上,但这并不是必需的,也可使用多个列作为主键。...表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键 将多个字段设置为主键,形成复合主键,这多个字段联合标识唯一性,其中,某几个主键字段值出现重复是没有问题的,只要不是有多条记录的所有主键值完全一样

    4.9K20

    MySQL 核心模块揭秘 | 32 期 | 插入记录,主键索引冲突加什么锁?

    本文基于 MySQL 8.0.32 源码,存储引擎为 InnoDB。 正文 1....begin; insert into t1(id, i1) values (10, 1010); 因为新插入记录和表中原有记录存在主键冲突,执行 insert 语句之后,报错如下: (1062, "Duplicate...原理分析 insert 语句执行过程中,插入记录到主键索引之前,需要先找插入记录的目标位置。 目标位置为表中主键字段值小于等于新插入记录中主键字段值的最后一条记录之后。...以示例 SQL 为例,插入主键字段 的记录。 插入记录到主键索引之前,先找到表中 id 小于等于 10 的最后一条记录,也就是 这条记录。...新插入记录的目标位置就是这条记录之后。 InnoDB 发现表中已经有一条 的记录,现在又要插入一条 的记录,可是主键索引中不允许存在重复记录,这可怎么办才好?

    8810
    领券