使用子查詢提高MySQL分頁效率 limit

2021-06-17 21:59:28 字數 2424 閱讀 8064

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越大,後者越優

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

1.select * from cyclopedia where id>=(select max(id) from (select id from cyclopedia order by id limit90001) as tmp) limit 100;

2.select * from cyclopedia where id>=(select max(id) from ( select id from cyclopedia order by id limit90000,1) as tmp) limit 100;

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

第1句是先取了前90001條記錄,取其最大id值作為起始,然後快速定位下100條記錄

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

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

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

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

靠主鍵id來定位起始段總是最快

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

limit 思考

percona performance conference 2009上,來自雅虎的幾位工程師帶來了一篇」efficientpagination using mysql「的報告,有很多亮點,本文是在原文基礎上的進一步延伸。首先看一下分頁的基本原理:

limit10000,20的意思掃瞄滿足條件的10020行,扔掉前面的10000行,返回最後的20行,問題就在這裡,如果是limit100000,100,需要掃瞄100100行,在乙個高併發的應用裡,每次查詢需要掃瞄超過10w行,效能肯定大打折扣。文中還提到limit n效能是沒問題的,因為只掃瞄n行。

select * from message where id > 9527 order byid asc limit 20;

select * from message where id < 9500 order byid desc limit 20;

不管翻多少頁,每次查詢只掃瞄20行。

如果limit m,n不可避免的話,要優化效率,只有盡可能的讓m小一下,我們擴充套件前面的」clue」做法,還是select *from message order by iddesc,按id降序分頁,每頁20條,當前是第10頁,當前頁條目id最大的是9527,最小的是9500,比如要跳到第8頁,我看的sql語句可以這樣寫:

select * from message where id > 9527 order byid asc limit 20,20;

跳轉到第13頁:

select * from message where id < 9500 order byid desc limit 40,20;

原理還是一樣,記錄住當前頁id的最大值和最小值,計算跳轉頁面和當前頁相對偏移,由於頁面相近,這個偏移量不會很大,這樣的話m值相對較小,大大減少掃瞄的行數。其實傳統的limitm,n,相對的偏移一直是第一頁,這樣的話越翻到後面,效率越差,而上面給出的方法就沒有這樣的問題。

注意sql語句裡面的asc和desc,如果是asc取出來的結果,顯示的時候記得倒置一下。已在60w資料總量的表中測試,效果非常明顯。

使用子查詢提高MySQL分頁效率

今天在老王的部落格中看到了一篇 驗證使用子查詢提高mysql分頁效率 的文章,很有收穫,總結分享之 對於有大資料量的mysql表來說,使用limit分頁存在很嚴重的效能問題。例如老王做的測試,拿乙個接近一千萬行記錄的表,進行查詢從第1000000之後的30條記錄 sql 1 平均用時6.6秒 sel...

高效的MySQL分頁 利用子查詢分頁

先抄回來 首先看一下分頁的基本原理 mysql explain select from message order by id desc limit 10000,20g 1.row id 1 select type table message type index possible keys nul...

Mysql採用子查詢優化查詢語句,提高查詢效率

摘要 mysql的優化方式有很多,這裡我先介紹一種,就是在使用連線查詢中的優化。案例 比如我要查詢100萬條資料中id小於100的資料,a表和b表有相同的字段id,那麼id就可以成為連線查詢的條件。如下所示 select from a join b on a.id b.id where id 100...