从磁盘I/O角度看MySQL索引

从磁盘I/O角度看MySQL索引

一、为什么MySQL查询瓶颈是磁盘I/O

从磁盘I/O角度看MySQL索引_第1张图片
由于MySQL数据存储保存在磁盘中,所以在查询时磁盘I/O是其主要查询性能瓶颈,而使用索引就可以减少磁盘I/O。

二、为什么使用索引查询性能会提高

正常查询的时间复杂度是O(N),因为可能需要全表查询遍历才可以查询到。

  1. 先从数据结构角度看,MySQL中主要是Btree索引,
    以下表为例
    从磁盘I/O角度看MySQL索引_第2张图片
    保存的数据
    从磁盘I/O角度看MySQL索引_第3张图片
    从磁盘I/O角度看MySQL索引_第4张图片
    从磁盘I/O角度看MySQL索引_第5张图片
    非叶子节点上以年龄分区,叶子节点上保存实际数据,叶子节点互相有指引,类似数组+链表形式,这种查询时间复杂度是O(logN),所以使用索引可以大大降低磁盘I/O

三、使用索引时应该注意什么

 有了索引依然可以继续进行优化以减少磁盘I/O。
  • 依据B+树索引保存方式可以看出最后是根据id去定位所有数据
  • 延伸到MySQL两个重要储存引擎InoonDB与MyISAM,叶子节点保存分别是实际数据和数据地址
    从磁盘I/O角度看MySQL索引_第6张图片

1. 索引字段不要太长

MySQL索引存储是一个个page文件,默认大小事16M,如果字段较短每个page可以保存的数据越多,磁盘I/O的情况越少

2. 索引的区分度

也就是可以区分数据的颗粒度,如时间字段颗粒度就会比较小,category分类字段颗粒度就会比较大,我们尽量使用颗粒度较小的字段

3. 查询中可以利用索引覆盖,来避免不必要的回表

通过二级索引不能查到所有数据,所以需要通过二级索引中的id再进行查找,这个过程叫做回表
从磁盘I/O角度看MySQL索引_第7张图片
上面查询方式就是索引覆盖
可以使用联合索引来启用索引覆盖

4. 不要建立太多索引

索引失效情况

  1. 被索引字段发生了隐式类型转换
  2. 被索引字段使用了表达式计算
  3. 被索引字段使用了函数
  4. like后面使用了左模糊匹配或左右模糊匹配
  5. 使用的索引不是联合索引的最左字段

上面提到几种索引失效情况主要原因是破坏了索引结构或者因为索引使用的是最左匹配原则导致使用失效。

总结

从MySQL查询瓶颈作为切入点,说明为什么添加索引会增加查询效率,实际上就是减少了磁盘I/O,由O(N) --> O(logN),然后说到添加了索引我们还可以怎样进行优化,从索引字段长度、索引区分度、利用索引覆盖、不要建立太多索引等几个方面说明。

你可能感兴趣的:(数据库)