MySQL limit分页性能小知识
limit 分页写起来简单,数据一多就露馅。limit 100000,10 不是直接跳到第10万行,而是先把前面10万行读出来再丢掉,页码越大越慢,越翻越卡。
常用两个解法。一是游标法,记住上一页最后一条的 id,下次直接带着它往后取,只适合连续翻页。二是延迟关联,先在索引里拿主键,再回表取整行,少做很多无用功。
-- 慢:翻到后头要先读10万行再丢掉
SELECT * FROM article ORDER BY id LIMIT 100000, 10;
-- 快:游标法,带上上一页最后一条的id
SELECT * FROM article WHERE id > 100000 ORDER BY id LIMIT 10;
-- 延迟关联:先走索引拿id,再回表取整行
SELECT a.* FROM article a
JOIN (SELECT id FROM article ORDER BY id LIMIT 100000, 10) b
USING(id);
还有一点,order by 的字段最好有索引。没索引的话 MySQL 得先全表排一遍,排序本身就够慢了,比 limit 还拖后腿。
说点什么 0