分页查询优化

LIMIT性能问题

  当偏移量m很大时,普通limit m,n的分页写法,存在严重的性能问题(速度原来越慢)。原因是mysql执行策略是会先扫描m+n行数据,然后扔掉前m行数据,最后返回剩余n行数据。因此,m越大,性能越差。

优化方案

思路:前后端相结合方案。前端已查询的每个页面保存第一个值和最后一个值,查询相邻页时,根据当前页的值进行查询过滤即可;后端的SQL语句使用inner join或子查询方式优化。

普通查询:SELECT * FROM articles WHERE category_id = 123 ORDER BY id LIMIT 500000, 10;

子查询:SELECT * FROM articles WHERE id >=
(SELECT id FROM articles WHERE category_id = 123 ORDER BY id LIMIT 500000, 1) LIMIT 10 ;

INNER JOIN:SELECT t1.* FROM articles AS t1 JOIN ((SELECT id FROM articles WHERE category_id = 123 ORDER BY id LIMIT 500000, 10) AS t2 ON t1.id=t2.id;

SELECT * FROM articles AS t1, (SELECT id FROM articles WHERE category_id = 123 ORDER BY id LIMIT 500000, 10) AS t2 WHERE t1.id=t2.id ;

本质: 在子查询中,where条件列被索引覆盖,查询出主键,生成临时表;外部查询与临时表通过主键join即可。这样好处是只对二级索引进行了扫描,大大降低了回表的概率;
参考:

  1. https://segmentfault.com/a/1190000008859706

你可能感兴趣的:(Mysql,面试系列)