select * from table_a limit m,n;
MySQL的 limit m,n 工作原理就是先讀取符合where條件的前面m+n條記錄,然後拋棄前m條,返回後面n條,所以m越大,偏移量越大,性能就越差。這也是大部分ORM框架生成的分頁sql。
那麼如何優化呢?
如果 id 是簡單的數字,可以這麼優化
select * from table_a where id > 1000000 limit 10;
能這麼優化是有前提的:
1、沒有總頁數
2、只能上下翻頁
3、id必須有序且唯一
而且現實場景不如像我們例子中那麼簡單,id 一般可能不是數字,數字的語義過於單薄。
不過類似的,比如我們要查一個有訂單號,有業務類型,訂單狀態的數據行出來,類似上面描述的3個條件,我們要這裏的id叫位點,要讓位點有序且唯一那麼設計成:
訂單號_時間戳_業務類型
唯一靠訂單號、業務類型、時間戳(訂單創建時間、訂單付款時間、訂單確認收貨時間)保證,有序靠時間戳保證。
特定的業務有特定的位點設計,上述的位點設計適用於大多數電商場景,其他場景怎麼解決深度翻頁的位點設計具體業務根據業務特點類似的設計就行。