如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页 。如下图所示:
文章插图
图13
这样就会形成一个紧凑的索引结构,近似顺序填满 。由于每次插入时也不需要移动已有数据,因此效率很高,也不会增加很多开销在维护索引上 。
如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置:
文章插图
图14
此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销,同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面 。
因此,只要可以,请尽量在InnoDB上采用自增字段做主键 。
后记这篇文章断断续续写了半个月,主要内容就是上面这些了 。不可否认,这篇文章在一定程度上有纸上谈兵之嫌,因为我本人对MySQL的使用属于菜鸟级别,更没有太多数据库调优的经验,在这里大谈数据库索引调优有点大言不惭 。就当是我个人的一篇学习笔记了 。
其实数据库索引调优是一项技术活,不能仅仅靠理论,因为实际情况千变万化,而且MySQL本身存在很复杂的机制,如查询优化策略和各种引擎的实现差异等都会使情况变得更加复杂 。但同时这些理论是索引调优的基础,只有在明白理论的基础上,才能对调优策略进行合理推断并了解其背后的机制,然后结合实践中不断的实验和摸索,从而真正达到高效使用MySQL索引的目的 。
另外,MySQL索引及其优化涵盖范围非常广,本文只是涉及到其中一部分 。如与排序(ORDER BY)相关的索引优化及覆盖索引(Covering index)的话题本文并未涉及,同时除B-Tree索引外MySQL还根据不同引擎支持的哈希索引、全文索引等等本文也并未涉及 。如果有机会,希望再对本文未涉及的部分进行补充吧 。
推荐阅读
- 日本|号称最轻松赚钱方式!日本新奇打工背着电脑走 网友直呼无聊
- Mysql事务隔离级别
- MySQL主从不一致情形与解决方法
- MySQL INSERT 有哪4种形态?
- 中老年耳背会遗传吗?
- 女性妇科炎症背酸怎么办呢?
- 泰姬陵背后的血腥恐怖袭击 泰姬陵的神秘事件
- MYSQL主主模式 LNMP 独立部署配置指导书
- MySQL的隐式转化
- 通用搜索引擎背后的技术点