mysql索引优化

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+树的叶子节点中查询到,不需要回表。

二、项目中如何合理的使用索引

添加索引场景

  • 区别度大的字段上加索引
  • 热度高的字段上加索引

索引失效场景

  • 索引字段使用函数
  • 索引字段参与运算
  • 索引字段使用了前模糊查询
  • 联合索引-不符合最左前缀原则
  • 使用索引比全表扫码更慢的情况
  • 多个单索引,引擎只选一个

三、SQL优化案例分析

案例1:小结果集驱动大结果集

案例2:使用联合索引提高执行效率

mysql索引优化

上一篇:pymysql.err.IntegrityError: (1062, “Duplicate entry ‘ ‘ for key ‘PRIMARY‘“)


下一篇:linux 之 非root用户安装mysql5.7.27