MySQL / 为什么需要主键?主键为什么最好是单调递增的?
无特殊需求下 Innodb 建议使用与业务无关的自增 ID 作为主键。
InnoDB引擎使用聚集索引,数据记录本身被存于主索引(一颗 B + Tree)的叶子节点上,这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放。因此每当有一条新的记录插入时,MySQL 会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB 默认为 15 / 16 ),则开辟一个新的页(节点)。
1、如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。
这样就会形成一个紧凑的索引结构,近似顺序填满。由于每次插入时也不需要移动已有数据,因此效率很高,也不会增加很多开销在维护索引上。
2、 如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置:此时 MySQL 不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销,同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE 来重建表并优化填充页面。
在使用 InnoDB 存储引擎时,如果没有特别的需要,请永远使用一个与业务无关的自增字段作为主键。
mysql 在频繁地更新、删除操作,会产生碎片。而含碎片比较大的表,查询效率会降低。此时需对表进行优化,这样才会使查询变得更有效率。
转载于:https://www.jianshu.com/p/33b7b6e0a396
(SAW:Game Over!)
MySQL / 为什么需要主键?主键为什么最好是单调递增的?相关推荐
- Mysql,SqlServer,Oracle主键自动增长的设置
Mysql,SqlServer,Oracle主键自动增长的设置 参考文献 http://blog.csdn.net/andyelvis/article/details/2446865 1.把主键定义为 ...
- MySQL中的索引(主键索引)
MySQL中的索引(主键索引篇) 主键索引是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值.一般是在建表的时候同时添加主键索引: 一.如何添加主键索引 修改表添加主键索引 Alter tab ...
- 【实施工程师之家】——mysql四种索引PRIMARY(主键索引)、INDEX(一般索引)、UNIQUE(非空索引)、FULLTEXT(全文索引)应用
mysql四种索引PRIMARY(主键索引).INDEX(一般索引).UNIQUE(非空索引).FULLTEXT(全文索引)应用 目录 1)PRIMARY: 2)NORMAL: 3)UNIQUE: 4 ...
- mysql 自增 不是主键_程序员经典面试题,MySQL自增主键为什么不连续
在我们日常使用Mysql中,如果不是特殊的业务需要,一般我们都会使用自增主键,自增主键的好处可以在插入的时候尽量地减少页分割,增加Mysql的写入效率.我们有时候就会发现,自增主键并不是连续递增的,为 ...
- mysql 主键外键sql_SQL外键VS主键说明了MySQL语法示例
mysql 主键外键sql A Foreign Key is a key used to link two tables. The table with the Foreign Key Constra ...
- mycat分布式mysql中间件(自增主键)
2019独角兽企业重金招聘Python工程师标准>>> 全局序列号是MyCAT提供的一个新功能,为了实现分库分表情况下,表的主键是全局唯一,而默认的MySQL的自增长主键无法满足这个 ...
- Mysql基础增删改查,主外键关联
Mysql基础入门 章节导航 Mysql基础入门 创建 新增 删除 修改 查询 数据类型 主键 外键 数值计算 关联查询 1.登录mysql:mysql -uroot -p2.使用数据库: use 数 ...
- mysql中表的约束,主键外键唯一键
mysql2 表的约束 空属性(NULL) 默认值 列描述 zerofill 主键 主键属性 复合主键 追加主键 删除主键 自增长 唯一键 外键 表的约束 空属性(NULL) 此时 name 的 Nu ...
- mysql 一 、关系模型——主键——外键——索引
关系模型 表的每一行称为记录(Record),记录是一个逻辑意义上的数据. 表的每一列称为字段(Column),同一个表的每一行记录都拥有相同的若干字段. 字段定义了数据类型(整型.浮点型.字符串.日 ...
- mysql数据库(排序,聚合函数,分组,分页查询,union,连接查询,主键外键)
1.排序(order by) select * from stu order by age; -- 默认升序 升序 ASC 降序DESC -- DESC 具有查看表的结构的功能 desc stu; 不 ...
最新文章
- 洛谷 P1219 八皇后
- jQuery操作标签--样式、文本、属性操作, 文档处理
- (一)编译器实现资料
- nssl1468-V【状压,数学期望,dfs】
- RedisDesktopManager的安装与使用
- java 对象查找_通过Java中的参数集查找最合适的对象
- 新荣耀员工现金补偿最高可拿 N+5;天津立法禁止采集人脸识别信息;IntelliJ IDEA 新版发布|极客头条...
- Windows Server 2008官方(MSDN)简体中文正式版试用心得
- TIA 和step 7硬件更新网址汇总
- Word重复操作快捷键F4
- 编程序,输入年份和月份,输出本月有多少天。合理选择分支语句完成设计任务。
- 查询指定时间范围内的订单信息
- 供应链金融的三种业务模式
- 雏鸟(1)--Foundation
- Opencv-python滤镜系列(3): 凹透镜滤镜效果实现
- 最长公共子序列 【DP】+【最长公共子序列】
- 算法进化历程之剪刀石头布
- CANoe.DiVa 操作指南 - DTC自动化测试
- 非线性控制1.4——图论及拉普拉斯矩阵
- kafka javax.management.InstanceAlreadyExistsException: kafka.consumer:type=app-info,id=consumer-1
热门文章
- Bootstrap3系列:下拉菜单
- Jquery 单击_双击_鼠标经过_鼠标离开_背景样式变化
- 沫沫金:联想E431 1K6安装Windows系统100%成功技巧
- 电商顾客满意的五大决定因素
- ResNext(2017)解读
- 达摩java_JAVA面向对象
- 【快速通关】Git快速上手gitee
- SpringCloud教程- 断路器(Hystrix)(SpringCloud版本Finchley)
- linux shell数组动态在for中追加元素及其遍历
- flink介绍:有界流和无界流