下面是正常的分页代码:
select * from shop limit 50000,10
弊端:
看似只查询了10条,其实是查询了50010,然后把前面50000条丢弃了,只显示这5条而已,如果数据量比较大的话,翻页会很卡的,在底层走的也是全表扫。
优化方式一:
select * from shop where id > 50000 limit 10
前提是表的主键id是自增的,改写后的 SQL 走了索引,而且扫描的行数大大减少,执行效率更高,不过如果中间有数据删除的话,就会失效,所以不太推荐
优化方式二:
先查询出分页的主键(覆盖索引):
select id from shop where id > 50000 limit 10
然后在外面关联一下:
SELECT
*
FROM
shop s
INNER JOIN ( SELECT id FROM shop WHERE id > 100000 LIMIT 10 ) s1 ON s.id = s1.id
经过测试,效率至少提升一倍