MySQL 分页查询limit性能缺陷和优化方案

MySQL使用 limit 分页:

limit m,n

其中,m是偏移量,n是要查询的数量。

当偏移量m过大的时候,查询效率会很低。因为MySQL是先查出m+n个数据,然后抛弃掉前m个数据。

优化方法:可以通过子查询查出查出目标数据集合的第一个数据所在的行,然后用 >= 操作。

如下:

SELECT * FROM articles WHERE id >= (SELECT id FROM articles  WHERE category_id = 123 ORDER BY id LIMIT 10000, 1) LIMIT 10 

子查询在主键id上先查到第一个目标数据的id,然后外层查询根据这个id,使用 >= 方式获取10条数据。

因为主键id有索引,所以子查询速度很快。


对于有大数据量的mysql表来说,使用LIMIT分页存在很严重的性能问题。

优化思想避免数据量大时扫描过多的记录

在这里插入图片描述

为了保证index索引列连续,可以为每个表加一个自增字段,并且加上索引。