為什麼MySQL分頁用limit會越來越慢

2022-09-21 16:12:13 字數 1854 閱讀 6170

目錄

阿牛新入職了一家新公司,第乙個任務是根據條件匯出訂單表中的資料到檔案中,阿牛心想:這也太簡單了,於是很快寫好了如下語句,並且告訴測試自己的**是免測產品。

語句如下:

select * from orders where name=『lilei' and create_time>'2020-01-01 00:00:00' limit start,end

沒想到上線一段時間後,生產開始預警,顯示這條sql為慢sql,執行時間50多秒,嚴重影響到了業務。

阿牛趕緊請教大佬猿猿幫忙查詢原因,猿猿很快就幫其解決了,並且給阿牛做了以下實驗:

mysql分頁直接用lzmchermbimit start, count分頁語句:

select * from product limit start, count

當起始頁較小時,查詢沒有效能問題,我們分別看下從10, 100, 1000, 10000開始分頁的執行時間(每頁取20條),如下:

select * from product limit 10, 20 0.016秒

select * from product limit 100, 20 0.016秒

select * from product limit 1000, 20 0.047秒

select * from product limit 10000, 20 0.094秒

我們已經看出隨著起始記錄的增加,時間也隨著增大, 這說明分頁語句limit跟起始頁碼是有很大關係的,

那麼我們把起始記錄改為40w看下(也就是記錄的一半左右)

select * from product limit 400000, 20 3.229秒

再看我們獲取最後一頁記錄的時間

select * from product limit 866613, 20 37.44秒

像這種分頁最大的頁碼頁顯然這種時間是無法忍受的。

從中我們也能總結出兩件事情:

limit語句的查詢時間與起始記錄的位置成正比。

mysql的limit語句是很方便,但是對記錄很多的表並不適合直接使用。

我們都知道,利用了索引查詢的語句中如果只包含了那個索引列(覆蓋索引),那麼這種情況會查詢很快。

因為利用索引查詢有優化演算法,且資料就在查詢索引上面,不用再去找相關的資料位址了,這樣節省了很多時間。

另外mysql中也有相關的索引快取,在併發高的時候利用快取就效果更好了。

在我們的例子中,我們知道id欄位是主鍵,自然就包含了預設的主鍵索引。現在讓我們看看利用覆蓋索引的查詢效果如何:

這次我們之間查詢最後一頁的資料(利用覆蓋索引,只包含id列),如下:

select izmchermbd from product limit 866613, 20

查詢時間為0.2秒,相對於查詢了所有列的37.44秒,提公升了大概100多倍的速度。

那麼如果我們也要查詢所有列,有兩種方法,

select * from product

where id > =(select id from product limitwww.cppcns.com 866613, 1) limit 20

查詢時間為0.2秒,簡直是乙個質的飛躍啊。

select * from product a

join (select id from pro程式設計客棧duct limit 866613, 20) b on a.id = b.id

是不是認為我沒說理由,原因就是使用select * 的情況下直接用limit 600000,10 掃瞄的是約60萬條資料,並且是需要回表60w次,也就是說大部分效能都耗在隨機訪問上,到頭來只用到10條資料,如果先查出來id,再關聯去查詢記錄,就會快很多,因為索引查詢符合條件的id很快,然後再回表10次。就可以拿到我們想要的資料。

Mysql分頁之limit用法與limit優化

與oracle和ms sqlserver相比,mysql的分頁方法簡單的讓人想哭。語法 select from table limit offset,rows rows offset offset 舉例 select from table limit5 返回前5行 select from table...

Mysql分頁之limit用法與limit優化

與oracle和ms sqlserver相比,mysql的分頁方法簡單的讓人想哭。語法 select from table limit offset,rows rows offset offset 舉例 select from table limit 5 返回前5行 select from tabl...

使用子查詢提高MySQL分頁效率 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 vi...