也談mysql的limit優化

2021-04-18 17:28:12 字數 4169 閱讀 9798

測試環境

作業系統: debian linux

伺服器版本: mysql 5.0.24

mysql資料庫的qcache快取關閉

資料庫表testtable的引數:

型別:     myisam 大小:     >80mb 記錄規模: >50000 字段數:   >25個字段

id是主鍵 leibie欄位上建有索引

進行資料分段測試

1>sql不帶where條件的測試

1)50290行開始顯示行 0 - 9 (10 總計, 查詢花費 0.2647 秒) sql 查詢: select * from `testtable` limit 50290 , 10

顯示行 0 - 9 (10 總計, 查詢花費 0.0377 秒) sql 查詢: select * from testtable where id >= ( select id from `testtable` limit 50290 , 1 ) limit 1 , 10

2)30290行開始

顯示行 0 - 9 (10 總計, 查詢花費 0.1527 秒) sql 查詢: select * from `testtable` limit 30290 , 10

顯示行 0 - 9 (10 總計, 查詢花費 0.0208 秒) sql 查詢: select * from testtable where id >= ( select id from `testtable` limit 30290 , 1 ) limit 1 , 10

3)20290行開始

顯示行 0 - 9 (10 總計, 查詢花費 0.1070 秒) sql 查詢: select * from `testtable` limit 20290 , 10

顯示行 0 - 9 (10 總計, 查詢花費 0.0191 秒) sql 查詢: select * from testtable where id >= ( select id from `testtable` limit 20290 , 1 ) limit 1 , 10

4)10290行開始

顯示行 0 - 9 (10 總計, 查詢花費 0.0707 秒) sql 查詢: select * from `testtable` limit 10290 , 10

顯示行 0 - 9 (10 總計, 查詢花費 0.0087 秒) sql 查詢: select * from testtable where id >= ( select id from `testtable` limit 10290 , 1 ) limit 1 , 10

5)5290行開始

顯示行 0 - 9 (10 總計, 查詢花費 0.0245 秒) sql 查詢: select * from `testtable` limit 5290 , 10

顯示行 0 - 9 (10 總計, 查詢花費 0.0065 秒) sql 查詢: select * from testtable where id >= ( select id from `testtable` limit 5290 , 1 ) limit 1 , 10

6)2590行開始

顯示行 0 - 9 (10 總計, 查詢花費 0.0140 秒) sql 查詢: select * from `testtable` limit 2590 , 10

顯示行 0 - 9 (10 總計, 查詢花費 0.0050 秒) sql 查詢: select * from testtable where id >= ( select id from `testtable` limit 2590 , 1 ) limit 1 , 10

7)1000行開始

顯示行 0 - 9 (10 總計, 查詢花費 0.0113 秒) sql 查詢: select * from `testtable` limit 1000 , 10

顯示行 0 - 9 (10 總計, 查詢花費 0.0043 秒) sql 查詢: select * from testtable where id >= ( select id from `testtable` limit 1000 , 1 ) limit 1 , 10

8)500行開始顯示行 0 - 9 (10 總計, 查詢花費 0.0062 秒) sql 查詢: select * from `testtable` limit 500 , 10

顯示行 0 - 9 (10 總計, 查詢花費 0.0037 秒) sql 查詢: select * from testtable where id >= ( select id from `testtable` limit 500 , 1 ) limit 1 , 10

9)300行開始

顯示行 0 - 9 (10 總計, 查詢花費 0.0067 秒) sql 查詢: select * from `testtable` limit 300 , 10

顯示行 0 - 9 (10 總計, 查詢花費 0.0055 秒) sql 查詢: select * from testtable where id >= ( select id from `testtable` limit 300 , 1 ) limit 1 , 10

10)100行開始

顯示行 0 - 9 (10 總計, 查詢花費 0.0055 秒) sql 查詢: select * from `testtable` limit 100 , 10

顯示行 0 - 9 (10 總計, 查詢花費 0.0112 秒) sql 查詢: select * from testtable where id >= ( select id from `testtable` limit 100 , 1 ) limit 1 , 10

2>sql帶where條件的測試(滿足條件的資料記錄》5000)

1)990行開始

顯示行 0 - 1 (2 總計, 查詢花費 0.0086 秒) sql 查詢: select * from `testtable` where leibie = 1 limit 990 , 10

顯示行 0 - 9 (10 總計, 查詢花費 0.0123 秒) sql 查詢: select * from `testtable` where id >= ( select id from `testtable` where leibie = 1 limit 990 , 1 ) limit 1 , 10

2)2990行開始顯示行 0 - 9 (10 總計, 查詢花費 0.0502 秒) sql 查詢: select * from `testtable` where leibie = 1 limit 2990 , 10

顯示行 0 - 9 (10 總計, 查詢花費 0.0357 秒) sql 查詢: select * from `testtable` where id >= ( select id from `testtable` where leibie = 1 limit 2990 , 1 ) limit 1 , 10

3)5690行開始

顯示行 0 - 9 (10 總計, 查詢花費 0.0547 秒) sql 查詢: select * from `testtable` where leibie = 1 limit 5690 , 10

顯示行 0 - 9 (10 總計, 查詢花費 0.2101 秒) sql 查詢: select * from `testtable` where id >= ( select id from `testtable` where leibie = 1 limit 5690 , 1 ) limit 1 , 10

測試結論:

不帶where條件時,limit後的數字小於100時,正常的sql語句效率比較高;limit後的數字大於100時,優化後的效率是沒有優化的1.2 - 7 倍. limit後的數字越大,優化後的效果越明顯.

帶where條件時,優化的結果就不明顯了,甚至是優化的結果效率更差了

mysql中limit的優化

mysql的優化是非常重要的。其他最常用也最需要優化的就是limit。mysql的limit給分頁帶來了極大的方便,但資料量一大的時候,limit的效能就急劇下降。同樣是取10條資料 select from yanxue8 visit limit 10000,10 和 select from yan...

MySQL中limit的優化

1.子查詢優化法 先找出第一條資料,然後大於等於這條資料的id就是要獲取的資料 缺點 資料必須是連續的,可以說不能有where條件,where條件會篩選資料,導致資料失去連續性 2.倒排表優化法 倒排表法類似建立索引,用一張表來維護頁數,然後通過高效的連線得到資料 缺點 只適合資料數固定的情況,資料...

mysql做好Limit優化

使用mysql時,往往需要指定返回幾行資料,此時可以使用limit關鍵字來實現這個需求。limit子句可以被用於強制select查詢語句返回指定的記錄數量。通常情況下,limit關鍵字可以接受乙個或者兩個數字引數。需要注意的是,這個引數必須是乙個整數常量。如果使用者給定兩個引數,則第乙個引數表示第乙...