MySQL
中我们经常用到分页查询,下面来看如下查询语句:
mysql> SELECT slug, title FROM `articles` where type = 0 order by view_count limit 10;
如果没有索引,这个查询将会变得很慢,即使有了索引,也不一定会变快。程序的展示页面可能是分页显示,如果点击的是中间的某个页面,类似如下的查询:
mysql> SELECT slug, title FROM `articles` where type = 0 order by view_count limit 1000000, 10;
这种查询,无论如何索引,查询速度都会非常慢,因为大偏距(high offset)值的查询,会花费大部分时间来扫描大量数据,而这些数据最终都会被丢弃;这种情况下,更好的办法是限制用户所看到的页,比如只提供最新的几页、上一页、下一页,因为没有什么用户会去关注第10000页的内容。
另一个办法是使用覆盖索引covering index
。以下示例中的表已经在type,view_count
上创建了索引,id是主键。
mysql> SELECT slug, title FROM `articles` INNER JOIN (SELECT id FROM articles where type = 0 order by view_count limit 10) as a on a.id = articles.id
以上语句中的SELECT
子查询SELECT id……
可以利用到覆盖索引,由于覆盖索引一般已被加载到内存,因此这种方式的排序效率会高许多。在一定的数据量下,性能尚可。