在開發過程中,我們少不了用到分頁,我最習慣的分頁是用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