MySQL分页优化

TrumanWong
11/23/2024
TrumanWong

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……可以利用到覆盖索引,由于覆盖索引一般已被加载到内存,因此这种方式的排序效率会高许多。在一定的数据量下,性能尚可。