mysql—索引优化

88 阅读4分钟

在 MySQL 中,索引是在存储引擎层实现的,所以并没有统一的索引标准,即不同存储引擎的索引的工作方式并不一样。而即使多个存储引擎支持同一种类型的索引,其底层的实现也可能不同。由于 InnoDB 存储引擎在 MySQL 数据库中使用最为广泛,所以下面都是以InnoDB为例。

什么是索引

数据库索引是一种数据结构,可以提高表中操作的速度。可以使用一列或多列创建索引,这为快速随机查找和对记录访问的有效排序提供了基础。

索引的其实就是为了提高数据查询的效率,就像书的目录一样。一本几百几千页的书,如果你想快速找到其中的某一个知识点,在不借助目录的情况下,那我估计你可得找一会儿。同样对于数据库的表而言,索引其实就是它的目录

底层存储结构

B+树

B+ 树是一种树数据结构,通常用于数据库和操作系统的文件系统中。B+ 树的特点是能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间复杂度。B+ 树元素自底向上插入,这与二叉树恰好相反。

B+树的一些规则:

  • 非叶子结点的子树指针个数与关键字(节点中的元素个数)个数相同
  • 非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间)
  • 所有叶子结点都有一个指针,连接成一个链表
  • 所有关键字都在叶子结点出现
  • 只有叶子节点存储值,内部节点只存储关键字

通过B+树来存储数据的结构如下:

微信截图_20220912103351.png

B+树优点

  • 内部节点只保存关键字,提高了阶数,加快查找时间。
  • 叶子节点中包含所有数据,所有叶子节点形成一个有序链表,让范围查找更高效。
  • B树相对于B+树的优点是,如果经常访问的数据离根节点很近,而B树的非叶子节点本身存有关键字其数据的地址,这种情况下数据检索会要比B+树快。

基于B+树的那么多优点,MySQL最终将其作为了索引的底层存储结构。

索引类型

根据叶子节点的内容可以将索引区别为主键索引和非主键索引

  • 主键索引的叶子节点存的是整行数据;在 InnoDB 里,主键索引也被称为聚簇索引(clustered index)。
  • 非主键索引的叶子节点内容是主键的值;在 InnoDB 里,非主键索引也被称为二级索引(secondary index)。

基于非主键索引的查询需要多扫描一棵索引树【覆盖索引情况下除外】

索引类型定义
唯一索引根据值是否唯一
组合索引是否包含多个字段

还有普通索引、全文索引等类型

常见优化手段

创建索引之前给自己抛出来一些问题???

  • 索引是否能够满足绝大多数的查询?
  • 索引的区分度是否足够大?
  • 组合索引的字段是否过多?是否存在区分度不高的字段?
  • 索引有没有提高效率的空间?

主键优化

由于 InnoDB 是索引组织表,一般情况下建议创建一个自增主键,这样非主键索引占用的空间最小。

覆盖索引

如果查询的字段可以通过索引覆盖,尽量优化使用覆盖索引,这样能减少回表。

最左前缀法则

对于组合索引,要知道最左前缀法则,直到碰到模糊条件、范围查询条件、运算等情况,索引会失效,所以尽量将等值的条件放在左侧,才能保证索引的使用。

包含的使用方式

如果使用包含则尽量使用in,in走索引,not in不走索引

总结

要多利用explain去分析sql语句,和跟踪慢查询日志,分析sql语句的执行过程,才能写出效率更高的执行语句。