高性能使用索引③

使用索引扫描排序

Mysql 有两种方式可以生成有序的结果:

  • 通过排序
  • 按索引顺序扫描

如果 explain 出来的 type 列的值为 index,说明Mysql 使用了索引扫描来排序

如果索引不能覆盖查询所需的全部列,就要扫描一条索引记录然后回表查询一次对应的行。

只有当索引的列顺序和 order by 子句的顺序完全一致,并且所有列的排序方向都一样时,Mysql才能够使用索引来对结果做排序。如果查询需要关联多张表,则只有当Order by子句引用的字段全部为第一个表时,才能使用索引做排序,满足最左前缀

前缀压缩索引

MyIsam 使用前缀压缩来减少索引的大小,从而让更多的索引放入内存中,默认只压缩字符串。

MyIsam 压缩每个索引块的方法是先完全保存索引块中的第一个值,然后将其他值和第一个值进行比较得到相同前缀的字节数和剩余的不同后缀部分,然后存储起来。

压缩块中的值压缩前缀都依赖前面的值,所以MyIsam查找时无法在索引块使用二分查找而只能从头开始扫描。倒序扫描很慢。

冗余索引和重复索引

重复索引是相同的列上按照相同的顺序创建的相同类型的索引,发现后应该立即移除

冗余索引是创建了索引(A,B),再创建索引(A)就是冗余索引

锁与索引

索引让查询锁定更少的行,如果你查询从不访问这些不需要的行,那么就会锁定更少的行。

Innodb 只有在访问行的时候才会对其加锁,而索引能够减少Innodb访问的行数,从而减少锁的数量。

如果不能使用索引查找和锁定行的话问题更糟糕,Mysql 会做全表扫描并锁住所有的行。

另外51blog2022年度评选开始了 希望我的文章的话就给我投票吧

https://blog.51cto.com/blog-contest/index#part2 搜索周杰伦本人或者41 谢谢了❤️ 投完票还可以抽奖哦