无特殊需求下 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 / 为什么需要主键?主键为什么最好是单调递增的?相关推荐

  1. Mysql,SqlServer,Oracle主键自动增长的设置

    Mysql,SqlServer,Oracle主键自动增长的设置 参考文献 http://blog.csdn.net/andyelvis/article/details/2446865 1.把主键定义为 ...

  2. MySQL中的索引(主键索引)

    MySQL中的索引(主键索引篇) 主键索引是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值.一般是在建表的时候同时添加主键索引: 一.如何添加主键索引 修改表添加主键索引 Alter tab ...

  3. 【实施工程师之家】——mysql四种索引PRIMARY(主键索引)、INDEX(一般索引)、UNIQUE(非空索引)、FULLTEXT(全文索引)应用

    mysql四种索引PRIMARY(主键索引).INDEX(一般索引).UNIQUE(非空索引).FULLTEXT(全文索引)应用 目录 1)PRIMARY: 2)NORMAL: 3)UNIQUE: 4 ...

  4. mysql 自增 不是主键_程序员经典面试题,MySQL自增主键为什么不连续

    在我们日常使用Mysql中,如果不是特殊的业务需要,一般我们都会使用自增主键,自增主键的好处可以在插入的时候尽量地减少页分割,增加Mysql的写入效率.我们有时候就会发现,自增主键并不是连续递增的,为 ...

  5. 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 ...

  6. mycat分布式mysql中间件(自增主键)

    2019独角兽企业重金招聘Python工程师标准>>> 全局序列号是MyCAT提供的一个新功能,为了实现分库分表情况下,表的主键是全局唯一,而默认的MySQL的自增长主键无法满足这个 ...

  7. Mysql基础增删改查,主外键关联

    Mysql基础入门 章节导航 Mysql基础入门 创建 新增 删除 修改 查询 数据类型 主键 外键 数值计算 关联查询 1.登录mysql:mysql -uroot -p2.使用数据库: use 数 ...

  8. mysql中表的约束,主键外键唯一键

    mysql2 表的约束 空属性(NULL) 默认值 列描述 zerofill 主键 主键属性 复合主键 追加主键 删除主键 自增长 唯一键 外键 表的约束 空属性(NULL) 此时 name 的 Nu ...

  9. mysql 一 、关系模型——主键——外键——索引

    关系模型 表的每一行称为记录(Record),记录是一个逻辑意义上的数据. 表的每一列称为字段(Column),同一个表的每一行记录都拥有相同的若干字段. 字段定义了数据类型(整型.浮点型.字符串.日 ...

  10. mysql数据库(排序,聚合函数,分组,分页查询,union,连接查询,主键外键)

    1.排序(order by) select * from stu order by age; -- 默认升序 升序 ASC 降序DESC -- DESC 具有查看表的结构的功能 desc stu; 不 ...

最新文章

  1. 洛谷 P1219 八皇后
  2. jQuery操作标签--样式、文本、属性操作, 文档处理
  3. (一)编译器实现资料
  4. nssl1468-V【状压,数学期望,dfs】
  5. RedisDesktopManager的安装与使用
  6. java 对象查找_通过Java中的参数集查找最合适的对象
  7. 新荣耀员工现金补偿最高可拿 N+5;天津立法禁止采集人脸识别信息;IntelliJ IDEA 新版发布|极客头条...
  8. Windows Server 2008官方(MSDN)简体中文正式版试用心得
  9. TIA 和step 7硬件更新网址汇总
  10. Word重复操作快捷键F4
  11. 编程序,输入年份和月份,输出本月有多少天。合理选择分支语句完成设计任务。
  12. 查询指定时间范围内的订单信息
  13. 供应链金融的三种业务模式
  14. 雏鸟(1)--Foundation
  15. Opencv-python滤镜系列(3): 凹透镜滤镜效果实现
  16. 最长公共子序列 【DP】+【最长公共子序列】
  17. 算法进化历程之剪刀石头布
  18. CANoe.DiVa 操作指南 - DTC自动化测试
  19. 非线性控制1.4——图论及拉普拉斯矩阵
  20. kafka javax.management.InstanceAlreadyExistsException: kafka.consumer:type=app-info,id=consumer-1

热门文章

  1. Bootstrap3系列:下拉菜单
  2. Jquery 单击_双击_鼠标经过_鼠标离开_背景样式变化
  3. 沫沫金:联想E431 1K6安装Windows系统100%成功技巧
  4. 电商顾客满意的五大决定因素
  5. ResNext(2017)解读
  6. 达摩java_JAVA面向对象
  7. 【快速通关】Git快速上手gitee
  8. SpringCloud教程- 断路器(Hystrix)(SpringCloud版本Finchley)
  9. linux shell数组动态在for中追加元素及其遍历
  10. flink介绍:有界流和无界流