在开发过程中,我们少不了用到分页,我最习惯的分页是用limit来分页。由于之前的时候写的项目数据量并不大,所以用的是pageHelper这个插件来分页的。以前也没有什么感觉,近期做的项目数据量有点大,越来越感觉sql效率不够,就看了一下它的基本工作原理。
当然,技术不到家,查看api什么的也看不太懂,就打印了一下最终执行的sql语句。对比之后发现是limit的偏移量问题导致的sql效率低下
写的sql原本是这样
select * from account where age >= 18;
最后执行的时候是这样
select * from (select * from account where age >= 18)where limit 100,10;
也就是说,用pageHelper插件的时候,它会拦截我们写的sql语句,自己重新包装一层,在后面添加limit。这在数据量小的时候当然是没有什么问题的,但是一旦数据量过大,那分页到后面数据时候limti的偏移量必然增大 ,不可避免的,查询的时间就会呈几何倍数增长。
我们可以换一种分页方式,缓解一下这种情况
子查询的分页方式:
SELECT * FROM account WHERE id >= (SELECT id FROM account WHERE age = 18 ORDER BY id LIMIT 10000, 1) LIMIT 10
JOIN分页方式
SELECT * FROM account a JOIN (select id from account limit 10000, 10) b ON a.ID = b.id