Mysql LIMIT如何正確對其進行優化

2021-07-11 06:08:17 字數 3561 閱讀 1044

以下的文章主要是對mysql limit簡單介紹,我們大家都知道limit子句一般是用來限制select語句返回的實際行數。limit取1個或是2個數字引數,如果給定的是2個引數,第乙個指定要返回的第一行的偏移量,第二個指定返回行的最大數目。

初始行的偏移

量是0(不是1)。

mysql

>

select * from table limit 6,10;  

得到第7-16行

如果給定乙個引數,它指出返回行的最大數目。

mysql

>

select * from table limit 5; 

得到前5行

換句話說,limit n等價於mysql limit 0,n。mysql的優化是非常重要的。其他最常用也最需要優化的就是limit。mysql的limit給分頁帶來了極大的方便,但資料量一大的時候,limit的效能就急劇下降。同樣是取10條資料

select * from yanxue8_visit limit 10000,10 

select * from yanxue8_visit limit 0,10 

就不是乙個數量級別的。

文中不是直接使用limit,而是首先獲取到offset的id然後直接使用mysql limit size來獲取資料。根據他的資料,明顯要好於直接使用limit。這裡我具體使用資料分兩種情況進行測試。(測試環境win2033+p4雙核(3ghz) +4g記憶體 mysql 5.0.19)

1、offset比較小的時候。

select * from yanxue8_visit limit 10,10 

多次執行,時間保持在0.0004-0.0005之間

select * from yanxue8_visit where vid 

>

=(  

select vid from yanxue8_visit order by vid limit 10,1  

) limit 10 

多次執行,時間保持在0.0005-0.0006之間,主要是0.0006結論:偏移offset較小的時候,直接使用limit較優。這個顯然是子查詢的原因。

2、offset大的時候

select * from yanxue8_visit limit 10000,10 

多次執行,時間保持在0.0187左右

select * from yanxue8_visit where vid 

>

=(  

select vid from yanxue8_visit order by vid limit 10000,1  

) limit 10 

多次執行,時間保持在0.0061左右,只有前者的1/3。可以預計offset越大,後者越優。

附上原文:

select * from table limit 5,10; #返回第6-15行資料

select * from table limit 5; #返回前5行

select * from table limit 0,5; #返回前5行

效能優化:

基於mysql5.0中mysql limit的高效能,我對資料分頁也重新有了新的認識.

select * from cyclopedia where id

>

=(  

select max(id) from (  

select id from cyclopedia order by id limit 90001  

) as tmp  

) limit 100;  

select * from cyclopedia where id

>

=(  

select max(id) from (  

select id from cyclopedia order by id limit 90000,1  

) as tmp  

) limit 100;  

同樣是取90000條後100條記錄,第1句快還是第2句快?

第1句是先取了前90001條記錄,取其中最大乙個id值作為起始標識,然後利用它可以快速定位下100條記錄

第2句擇是僅僅取90000條記錄後1條,然後取id值作起始標識定位下100條記錄

第1句執行結果.100 rows in set (0.23) sec

第2句執行結果.100 rows in set (0.19) sec

很明顯第2句勝出.看來limit好像並不完全像我之前想象的那樣做全表掃瞄返回limit offset+length條記錄,這樣看來limit比起ms-sql的top效能還是要提高不少的.

其實第2句完全可以簡化成

select * from cyclopedia where id

>

=(  

select id from cyclopedia limit 90000,1  

)limit 100; 

直接利用第90000條記錄的id,不用經過max運算,這樣做理論上效率因該高一些,但在實際使用中幾乎看不到效果,因為本身定位id返回的就是1條記錄,max幾乎不用運作就能得到結果,但這樣寫更清淅明朗,省去了畫蛇那一足.

可是,既然mysql有limit可以直接控制取出記錄的位置,為什麼不乾脆用select * from cyclopedia limit 90000,1呢?豈不更簡潔?

這樣想就錯了,試了就知道,結果是:1 row in set (8.88) sec,怎麼樣,夠嚇人的吧,讓我想起了昨天在4.1中比這還有過之的"高分".select * 最好不要隨便用,要本著用什麼,選什麼的原則, select的字段越多,字段資料量越大,速度就越慢. 上面2種分頁方式哪種都比單寫這1句強多了,雖然看起來好像查詢的次數更多一些,但實際上是以較小的代價換取了高效的效能,是非常值得的.

第1種方案同樣可用於ms-sql,而且可能是最好的.因為靠主鍵id來定位起始段總是最快的.

select top 100 * from cyclopedia where id

>

=(  

select top 90001 max(id) from (  

select id from cyclopedia order by id  

) as tmp  

)

但不管是實現方式是存貯過程還是直接**中,瓶頸始終在於ms-sql的top總是要返回前n個記錄,這種情況在資料量不大時感受不深,但如果成百上千萬,效率肯定會低下的.相比之下mysql的mysql limit就有優勢的多,執行:

select id from cyclopedia limit 90000  

select id from cyclopedia limit 90000,1 

而ms-sql只能用select top 90000 id from cyclopedia 執行時間是390ms,執行同樣的操作時間也不及mysql的360ms.

**:

如何正確對tomcat host進行配置

今天在對tomcat的host容器 即虛擬主機的配置 進行配置時,發現即使修改了host name的值 預設為localhost 但是仍無法訪問web專案的問題 提示網域名稱解析出錯 只能使用預設的值local host進行訪問。如上圖,即使將host修改為ui,但仍只能通過locahost訪問 無...

如何提高MySQL Limit查詢的效能

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

如何對自己做好正確的人生規劃

學會人際關係,多認識積極的朋友,十年後這些朋友都將是產業的中堅 25 30歲,您像一塊海綿,努力吸收也甘心被壓榨,為的只是自我的成長。這時候的您,應是工作取向,薪水待遇。公升遷調職您應該是斤斤計較。因為唯有努力付出,相對的您才敢積極爭取,社會新鮮人的動力應該讓您衝出自己的一片天,也因為沒有經驗,所以...