面试宝典系列-InnoDB的主键选择与优化
2018-08-23 16:21
585 查看
在使用InnoDB存储引擎时,如果没有特别的需要,请永远使用一个与业务无关的自增字段作为主键。
经常有人讨论主键选择问题,有人建议使用和业务无关的字段作为主键,有人认为不需要,使用如学号、身份证号的唯一字段就可以作为主键。
通过之前的InnoDB引擎结构文章中,我们就学习到如果从数据库索引优化角度看,使用InnoDB引擎而不使用自增主键绝对是一个糟糕的主意。
InnoDB使用聚集索引,数据记录本身被存于主索引(一颗B+Tree)的叶子节点上。这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放,因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15/16),则开辟一个新的页(节点)。
如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。如下图所示:
这样就会形成一个紧凑的索引结构,近似顺序填满。由于每次插入时也不需要移动已有数据,因此效率很高,也不会增加很多开销在维护索引上。
如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置:
此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销,同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面。
而且身份证、学号字段长度较长,导致索引文件会很大
经常有人讨论主键选择问题,有人建议使用和业务无关的字段作为主键,有人认为不需要,使用如学号、身份证号的唯一字段就可以作为主键。
通过之前的InnoDB引擎结构文章中,我们就学习到如果从数据库索引优化角度看,使用InnoDB引擎而不使用自增主键绝对是一个糟糕的主意。
InnoDB使用聚集索引,数据记录本身被存于主索引(一颗B+Tree)的叶子节点上。这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放,因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15/16),则开辟一个新的页(节点)。
如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。如下图所示:
这样就会形成一个紧凑的索引结构,近似顺序填满。由于每次插入时也不需要移动已有数据,因此效率很高,也不会增加很多开销在维护索引上。
如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置:
此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销,同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面。
而且身份证、学号字段长度较长,导致索引文件会很大
相关文章推荐
- [MySQL优化案例]系列 -- InnoDB主键设计
- 面试宝典系列-mysql引擎Innodb和MyISAM的区别
- 面试宝典系列-MyISAM引擎和InnoDB引擎下的索引详解
- InnoDB的主键选择与插入优化
- 面试常考 MySQL优化 事务处理 MyISAM和InnoDB索引实现
- Mysql优化系列--Innodb引擎下mysql自身配置优化-转
- Mysql数据库优化系列(四)------表的优化与列类型选择
- InnoDB 主键的选择:自增ID & 业务ID
- [MySQL优化案例]系列 -- 在5.1的分区功能中混用InnoDB和MyISAM
- 数据库SQL Server性能优化之主键选择总结
- 面试宝典系列-读《深入学习Redis(4):哨兵》概要
- 面试宝典系列-MySQL的四种事务隔离级别
- 面试宝典系列-读《深入学习Redis(2):持久化》概要
- 面试宝典系列-Web安全与攻击
- Mysql优化系列(1)--Innodb引擎下mysql自身配置优化
- 优化 | InnoDB表一定要用自增列做主键
- [MySQL优化案例]系列 — 优化InnoDB表BLOB列的存储效率
- InnoDB 主键的选择:自增ID & 业务ID
- MySQL查询优化系列讲座之调度和锁定 选择自 arcow 的 Blog
- MySQL数据库性能优化之存储引擎选择(MyISAM、InnoDB、NDBCluster)