说说MySQL索引机制

索引原理

  • 索引简述

首先MySQL如果没有索引的话查询速度非常的慢,于是鉴于二分查找的快速性建立索引,MySQL用的是B+树做索引,如图
在这里插入图片描述
子叶节点保存数据信息,非子叶节点保存目录信息,即对应某页的最小值和指向某页每个节点保存一页数据,页之间用双向链表连接(用双向链表便于遍历),一页保存16k的记录,页面内每条记录之间通过单链表连接(用单链表主要是为了重复利用空间设计),由主键(如果没有设计主键按隐藏自增主键列的值)小到大排序好的,每个页还有相应的槽像书的目录一样记录一段记录的值和地址偏移可以直接指向访问而不是从链头遍历访问那种。B+树索引的查询过程为先与B+树的根进行对比查找,通过索引值对比槽进行快速寻找,找到一个后一个值比它大前一个值比它小的位置,去小的那列获取对应页数找到对应的页数做同样的比较寻找,当找到叶子节点时即找到。

  • 二级索引
    二级索引即通过索引列再建立一颗B+树,树的节点保存的和一级索引不同的是在非子叶节点多保存主键值保证索引的唯一性,在叶子节点保存的只有该二级索引值和对应以及索引即主键值,不保存完整的数据列。查询过程先通过索引找到该值对应的主键值再通过主键值进行回表查询到完整的记录,但如果只是查询主键值就不用回表,所以尽量少用或者不用类似(select * from xxxx)这种星号的查询。

SQL执行慢的原因

  1. 偶尔慢
    可能是日志redo写满了在刷新脏页然后读取到缓冲区过程变慢,或者可能要访问的数据有锁处于阻塞等待。
  2. 一直很慢
    这种情况就是往没走索引的方向找原因,可能是没有建立索引,可能是建立了没有走索引,可能是数据库选错了索引。
    常见的就是比如索引列用了 表达式,模糊查询时模糊符号在前面等就会不走索引
    数据库走错索引多半是因为查找二级索引时数据库会在查询优化器里预判是直接全盘扫描还是先走二级索引再回表代价大,谁代价更小用谁通过采样统计的方式预判,所以可能会预判错误,然后不走索引而是全盘扫描。

总结

在使用索引时需要注意下边这些事项:
1、只为用于搜索、排序或分组的列创建索引
2、为列的基数大的列创建索引
3、索引列的类型尽量小
4、可以只对字符串值的前缀建立索引
5、只有索引列在比较表达式中单独出现才可以适用索引
6、为了尽可能少的让聚簇索引发生页面分裂和记录移位的情况,建议让主键拥有AUTO_INCREMENT属性。
7、定位并删除表中的重复和冗余索引
8、尽量使用覆盖索引进行查询,即最好在查询列表里只包含索引列避免回表带来的性能损耗。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章