怎么合理使用索引
怎么合理使用索引
使用索引扫描排序
Mysql 有两种方式可以生成有序的结果:
通过排序
按索引顺序扫描
如果 explain 出来的 type 列的值为 index,说明 Mysql 使用了索引扫描来排序
如果索引不能覆盖查询所需的全部列,就要扫描一条索引记录然后回表查询一次对应的行。
只有当索引的列顺序和 order by 子句的顺序完全一致,并且所有列的排序方向都一样时,Mysql 才能够使用索引来对结果做排序。如果查询需要关联多张表,则只有当 Order by 子句引用的字段全部为第一个表时,才能使用索引做排序,满足最左前缀
前缀压缩索引
MyIsam 使用前缀压缩来减少索引的大小,从而让更多的索引放入内存中,默认只压缩字符串。
MyIsam 压缩每个索引块的方法是先完全保存索引块中的第一个值,然后将其他值和第一个值进行比较得到相同前缀的字节数和剩余的不同后缀部分,然后存储起来。
压缩块中的值压缩前缀都依赖前面的值,所以 MyIsam 查找时无法在索引块使用二分查找而只能从头开始扫描。倒序扫描很慢。
冗余索引和重复索引
重复索引是相同的列上按照相同的顺序创建的相同类型的索引,发现后应该立即移除
冗余索引是创建了索引(A,B),再创建索引(A)就是冗余索引
锁与索引
索引让查询锁定更少的行,如果你查询从不访问这些不需要的行,那么就会锁定更少的行。
Innodb 只有在访问行的时候才会对其加锁,而索引能够减少 Innodb 访问的行数,从而减少锁的数量。
如果不能使用索引查找和锁定行的话问题更糟糕,Mysql 会做全表扫描并锁住所有的行。
版权声明: 本文为 InfoQ 作者【周杰伦本人】的原创文章。
原文链接:【http://xie.infoq.cn/article/a9016fd60d7b0f068aa54b69e】。文章转载请联系作者。
评论