建網(wǎng)站也談mysql的limit優(yōu)化
作者:佚名 時間:2012-05-04 分享到:
測試環(huán)境
操作系統(tǒng): debian linux
服務(wù)器版本: Mysql 5.0.24
Mysql數(shù)據(jù)庫的Qcache緩存關(guān)閉
數(shù)據(jù)庫表testtable的參數(shù):
類型: MyISAM 大小: >80MB 記錄規(guī)模: >50000 字段數(shù): >25個字段
id是主鍵 leibie字段上建有索引
進行數(shù)據(jù)分段測試
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條件的測試(滿足條件的數(shù)據(jù)記錄>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
測試結(jié)論:
不帶where條件時,limit后的數(shù)字小于100時,正常的SQL語句效率比較高;limit后的數(shù)字大于100時,優(yōu)化后的效率是沒有優(yōu)化的1.2 - 7 倍. limit后的數(shù)字越大,優(yōu)化后的效果越明顯.
帶where條件時,優(yōu)化的結(jié)果就不明顯了,甚至是優(yōu)化的結(jié)果效率更差了