深分頁:分頁太多,越往後的頁數查詢越慢。
例如:
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內連接,這樣後面直接走了主鍵索引了,同時也減少了回表。