目录:


维护索引和表

优化排序

对于索引的选择性非常低的列,如 sex 列,该如何排序?

可以增加一些特殊的索引来做排序,如创建 (sex, rating) 索引用于下面的查询:

1
SELECT cols FROM profiles WHERE sex='M' ORDER BY rating LIMIT 10;

即使有索引,但是用户需要翻页,并且页面比较靠后的时候可能也会很慢。如下面的 sql :

1
SELECT cols FROM profiles WHERE sex='M' ORDER BY rating LIMIT 100000, 10;

随着偏移量的增加 MySQL 需要花费大量的时间来扫描需要丢弃的数据。

一个解决方法就是延迟关联,通过覆盖索引返回需要的主键,在根据这些主键关联表,获得需要的行。

1
2
3
SELECT cols FROM profiles INNER JOIN (
SELECT cols FROM profiles WHERE x.sex='M' ORDER BY rating LIMIT 100000, 10
) AS x USING(cols);

延迟关联其实涉及到 LIMIT 语句的一些细节用法,接下来参考 MySQL 官方文档,介绍下 ORDER BY 和 LIMIT 。