mysql優化limit查詢語句的5個方法

2021-07-11 16:11:23 字數 4616 閱讀 4047

mysql的分頁比較簡單,只需要limit offset,length就可以獲取資料了,但是當offset和length比較大的時候,mysql明顯效能下降

1.子查詢優化法

先找出第一條資料,然後大於等於這條資料的id就是要獲取的資料

缺點:資料必須是連續的,可以說不能有where條件,where條件會篩選資料,導致資料失去連續性,具體方法請看下面的查詢例項:

複製**

**如下:

mysql> set profiling=1;

query ok, 0 rows affected (0.00 sec)

mysql> select count(*) from member;

+----------+

| count(*) |

+----------+

|   169566 |

+----------+

1 row in set (0.00 sec)

mysql> pager grep !~-

pager set to 'grep !~-'

mysql> select * from member limit 10, 100;

100 rows in set (0.00 sec)

mysql> select * from member where memberid >= (select memberid from member limit 10,1) limit 100;

100 rows in set (0.00 sec)

mysql> select * from member limit 1000, 100;

100 rows in set (0.01 sec)

mysql> select * from member where memberid >= (select memberid from member limit 1000,1) limit 100;

100 rows in set (0.00 sec)

mysql> select * from member limit 100000, 100;

100 rows in set (0.10 sec)

mysql> select * from member where memberid >= (select memberid from member limit 100000,1) limit 100;

100 rows in set (0.02 sec)

mysql> nopager

pager set to stdout

mysql> show profiles\g

*************************** 1. row ***************************

query_id: 1

duration: 0.00003300

query: select count(*) from member

*************************** 2. row ***************************

query_id: 2

duration: 0.00167000

query: select * from member limit 10, 100

*************************** 3. row ***************************

query_id: 3

duration: 0.00112400

query: select * from member where memberid >= (select memberid from member limit 10,1) limit 100

*************************** 4. row ***************************

query_id: 4

duration: 0.00263200

query: select * from member limit 1000, 100

*************************** 5. row ***************************

query_id: 5

duration: 0.00134000

query: select * from member where memberid >= (select memberid from member limit 1000,1) limit 100

*************************** 6. row ***************************

query_id: 6

duration: 0.09956700

query: select * from member limit 100000, 100

*************************** 7. row ***************************

query_id: 7

duration: 0.02447700

query: select * from member where memberid >= (select memberid from member limit 100000,1) limit 100

從結果中可以得知,當偏移1000以上使用子查詢法可以有效的提高效能。

2.倒排表優化法

倒排表法類似建立索引,用一張表來維護頁數,然後通過高效的連線得到資料

缺點:只適合資料數固定的情況,資料不能刪除,維護頁表困難

倒排表介紹:(而倒排索引具稱是搜尋引擎的演算法基石)

倒排表是指存放在記憶體中的能夠追加倒排記錄的倒排索引。倒排表是迷你的倒排索引。

臨時倒排檔案是指存放在磁碟中,以檔案的形式儲存的不能夠追加倒排記錄的倒排索引。臨時倒排檔案是中等規模的倒排索引。

最終倒排檔案是指由存放在磁碟中,以檔案的形式儲存的臨時倒排檔案歸併得到的倒排索引。最終倒排檔案是較大規模的倒排索引。

倒排索引作為抽象概念,而倒排表、臨時倒排檔案、最終倒排檔案是倒排索引的三種不同的表現形式。

3.反向查詢優化法

當偏移超過一半記錄數的時候,先用排序,這樣偏移就反轉了

缺點:order by優化比較麻煩,要增加索引,索引影響資料的修改效率,並且要知道總記錄數 ,偏移大於資料的一半

limit偏移演算法:

正向查詢: (當前頁 - 1) * 頁長度

反向查詢: 總記錄 - 當前頁 * 頁長度

做下實驗,看看效能如何

總記錄數:1,628,775

每頁記錄數: 40

總頁數:1,628,775 / 40 = 40720

中間頁數:40720 / 2 = 20360

第21000頁

正向查詢sql:

複製**

**如下:

select * from `abc` where `batchid` = 123 limit 839960, 40 

反向查詢sql:

複製**

**如下:

select * from `abc` where `batchid` = 123 order by inputdate desc limit 788775, 40

第30000頁

正向查詢sql: 

複製**

**如下:

select * from `abc` where `batchid` = 123 limit 1199960, 40 

反向查詢sql:

複製**

**如下:

select * from `abc` where `batchid` = 123 order by inputdate desc limit 428775, 40 

注意,反向查詢的結果是是降序desc的,並且inputdate是記錄的插入時間,也可以用主鍵聯合索引,但是不方便。

4.limit限制優化法

把limit偏移量限制低於某個數。。超過這個數等於沒資料,我記得alibaba的dba說過他們是這樣做的

5.只查索引法

mysql的limit工作原理就是先讀取n條記錄,然後拋棄前n條,讀m條想要的,所以n越大,效能會越差。

優化前sql:

複製**

**如下:

select * from member order by last_active limit 50,5

優化後sql:

複製**

**如下:

select * from member inner join (select member_id from member order by last_active limit 50, 5) using (member_id)

區別在於,優化前的sql需要更多i/o浪費,因為先讀索引,再讀資料,然後拋棄無需的行。而優化後的sql(子查詢那條)唯讀索引(cover index)就可以了,然後通過member_id讀取需要的列。

總結:limit的優化限制都比較多,所以實際情況用或者不用只能具體情況具體分析了。頁數那麼後,基本很少人看的.

MYSQL查詢優化 Limit

select from table limit offset,rows rows offset offset 在我們使用查詢語句的時候,經常要返回前幾條或者中間某幾行資料,這個時候怎麼辦呢?不用擔心,mysql 已經為我們提供了上面這樣乙個功能。limit 子句可以被用於強制 select 語句返回...

Mysql查詢使用Limit優化

在某些情況下,如果明知道查詢結果只有乙個,sql語句中使用limit 1會提高查詢效率,感興趣的朋友可以了解下哈,希望對你優化mysql查詢有所幫助 在某些情況下,如果明知道查詢結果只有乙個,sql語句中使用limit 1會提高查詢效率。例如下面的使用者表 主鍵id,郵箱,密碼 複製 如下 crea...

MySQL慢查詢優化之Limit優化

資料來源是4000000萬條員工資料 1.一般方法 2.延遲關聯優化方法 優化思路 3.利用上一次limit查詢主鍵值 select from emp where empno 1000000 limit 20對以上三種limit分頁方法執行100次查詢,計算每種查詢的平均執行時間 對比速度下來第一種...