Mysql性能优化
一、 Mysql的innodb索引的实现原理
innodb目前是mysql默认的存储引擎(从5.5.8版本开始),表根据主键组织存放,又称主键索引表,B+树数据结构实现,每张表都有一个主键,如果在创建时没有显示的制定,则innodb会找最近的唯一索引作为主键索引,如果也无唯一索引,则默认生成一个6字节的int类型自增主键。
innodb逻辑存储结构
所有数据存放在表空间,表空间由段、区、页组成,页是InnoDB磁盘管理的最小单位,默认大小为16kb
B+树是B树的升级版,左节点比右节点小,树的高度低,一个节点可存储多个数据,叶子节点是一个有序双向链表。每个节点是一个页,每个页可存放多个数据,每个数据页中以有序数组的方式存放数据,遍历时可使用二分查找法。
B+树索引只是查询找数据行所在的页,然后把页读到内存再进行查找。
B+树结构图
数据结构可视化网址: https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html
一张图片
常见索引介绍
主键索引
树上每个非叶子节点存放的是索引值和页指针,叶子节点存放的是索引值和全量数据。
辅助索引
辅助索引(非主键索引),非叶子节点存放的是索引值和页指针,叶子节点存放的是索引值和主键值,找到主键值后,再到主键索引树上进行查找-简称回表。
联合索引
联合索引,指由多个字段组成的索引,根据从左到右,按顺序查找数据。
覆盖索引
在非主键索引场景中,使用了索引的查询并且查询结果中包含索引字段的情况,目标值可在辅助索引B+树的叶子节点中查询到,不需要回表。
二、项目中如何合理的使用索引
添加索引场景
- 区别度大的字段上加索引
- 热度高的字段上加索引
索引失效场景
- 索引字段使用函数
- 索引字段参与运算
- 索引字段使用了前模糊查询
- 联合索引-不符合最左前缀原则
- 使用索引比全表扫码更慢的情况
- 多个单索引,引擎只选一个