SQL分頁過多時(例如 limit 1000000, 20),效率會明顯降低下,如何優化?
SQLServer用的是類似:
代碼如下 復制代碼 SELECT top 10 * FROM USER ORDER BY uid ASC ;MySQL用的是類似:
代碼如下 復制代碼 SELECT * FROM USER ORDER BY uid ASC LIMIT 0,10;如果要顯示第二頁的數據,通常的做法是
代碼如下 復制代碼 SELECT * FROM USER ORDER BY uid ASC LIMIT 10,10;這樣的問題是,當數據量過多,越往後翻頁速度越慢,那麼有什麼簡單的解決辦法嗎?如下幾種方式可參考:
一、如果是連續分頁查詢,可通過上次結果中的最大id,直接定位下一頁的數據集合。
1、第一頁:
代碼如下 復制代碼 SELECT * FROM USER ORDER BY uid ASC LIMIT 0,10;2、找到最後一條記錄的uid,$uid 。
3、第二頁:
這樣的話,由於查詢出來的結果集合變小了,所以各方面效率都高。
而且後面的limit條件基本不需要改變。
二、對於主見ID連續的表,可以先通過程序計算出所需分頁位置的 ID 起始值,然後通過BETWEEN .. AND 方式提交查詢。
三、使用子查詢獲取分頁主鍵值,充分利用主鍵索引,如:
代碼如下 復制代碼 SELECT t.* FROM ( SELECT id FROM you_table ORDER BY id LIMIT 1000000, 20 ) s JOIN your_table t ON t.id = s.id; www.111cn.net四、采用NoSQL或單獨的表作為索引表,或按數據新舊冷熱等規則分表存儲。