MySQL高性能的索引策略(四)
MySQL高性能的索引策略(四) 使用索引扫描来做排序 mysql有两种方式可以生成有序的结果: 通过排序操作;或者通过索引顺序扫描; 如果explain出来的type列的值为index,则说明mysql使用了索引扫描来做排序(不要和Extra 列的“using index”搞混淆了)。 扫描索引本身是很快的,因为只需从一条记录移动到紧接着的下一条记录。 但如果索引不能覆盖查询所需的全部列,那就不得不每扫描一条索引记录就得回表查询一次对应的行。这基本上都是随机IO,因此按索引顺序读取数据的速度通常比顺序的全表扫描慢,尤其是在IO密集型的工作负载时。 mysql可以使用同一个索引既满足排序,又用于查找行。 因此如果可能,设计索引时应该尽可能的满足这两种任务。 只有当索引的列的顺序和order by子句的顺序完全一致,并且所有列的排序方向(倒序和正序)都一样时,mysql才能使用索引来对结果做排序。 如果查询需要关联多张表,则只有order by子句引用的字段全部为第一个表时,才能使用索引来做排序。 order by子句和查找型查询的限制时一样的: 需要满足索引的最左前缀的要求; 否则,mysql都需要执行排序操作,而无法利用索引排序。 有一种情况下order by子句可以不满足索引的最左前缀要求,就是前导列为常量的时候。 如果where子句或者join子句中对这些列指定了常量