深分頁查詢慢問題

深分頁:分頁太多,越往後的頁數查詢越慢。

例如:

select id,name,balance from account where create_time> '2020-09-19' limit 100000,10;

limit 100000,10意味着會掃描100010行,丟棄掉前100000行,最後返回10行。即使create_time,也會回表很多次。

我們可以通過標籤記錄法和延遲關聯法來優化深分頁問題。

1.標籤記錄法

就是標記一下上次查詢到哪一條了,下次再來查的時候,從該條開始往下掃描。就好像看書一樣,上次看到哪裏了,你就摺疊一下或者夾個書籤,下次來看的時候,直接就翻到啦。

假設上一次記錄到100000,則SQL可以修改爲:

select  id,name,balance FROM account where id > 100000 limit 10;

這樣的話,後面無論翻多少頁,性能都會不錯的,因爲命中了id主鍵索引。但是這種方式有侷限性:需要一種類似連續自增的字段。

2.延遲關聯法

延遲關聯法,就是把條件轉移到主鍵索引樹,然後減少回表。優化後的SQL如下:

select  acct1.id,acct1.name,acct1.balance FROM account acct1 INNER JOIN (SELECT a.id FROM account a WHERE a.create_time > '2020-09-19' limit 100000, 10) AS acct2 on acct1.id= acct2.id;

優化思路就是,先通過idx_create_time二級索引樹查詢到滿足條件的主鍵ID,再與原表通過主鍵ID內連接,這樣後面直接走了主鍵索引了,同時也減少了回表。

參考:https://mp.weixin.qq.com/s/DGP1frbIlirZ_C8Vd0OmEA

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章