MySQL查詢中LIMIT的大offset導(dǎo)致性能低下淺析
前言
我們大家都知道,mysql查詢使用select命令,配合limit,offset參數(shù)可以讀取指定范圍的記錄,但是offset過大影響查詢性能的原因及優(yōu)化方法
我們在業(yè)務(wù)系統(tǒng)中難免少不了分頁的需求。想到分頁的時候,大家肯定會想到使用SQL中的LIMIT來實現(xiàn)。但是,如果不正確的使用LIMIT會導(dǎo)致性能問題(SQL執(zhí)行得很慢、有可能會拖垮服務(wù)器),也會被領(lǐng)導(dǎo)批的;所以,我們來看看如何正確地使用LIMIT。
下面話不多說了,來一起看看詳細(xì)的介紹吧
LIMIT OFFSET, ROW_COUNT 實現(xiàn)分頁
存在性能問題的方式
SELECT * FROM myTable ORDER BY `id` LIMIT 1000000, 30
寫出這樣SQL語句的人肯定心里是這樣想的:MySQL數(shù)據(jù)庫會直接定位到符合條件的第1000000位,然后再取30條數(shù)據(jù)。
然而,實際上MySQL不是這樣工作的。
LIMIT 1000000, 30 的意思是:掃描滿足條件的1000030行,扔掉前面的1000000行,然后返回最后的30行。
較好的方式
SELECT t.*
FROM (
SELECT id
FROM myTable
ORDER BY
id
LIMIT 1000000, 30
) q
JOIN myTable t
ON t.id = q.id
大概的原理是:
- 子查詢只用到了索引列,沒有取實際的數(shù)據(jù),所以不涉及到磁盤IO,所以即使是比較大的 offset,查詢速度也不會太差。
對具體的原理分析感興趣的朋友可以看看這篇文章:MySQL ORDER BY / LIMIT performance: late row lookups
后記
未完待續(xù)。
參考資料
- Why does MYSQL higher LIMIT offset slow the query down?
- MySQL ORDER BY / LIMIT performance: late row lookups
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
解決Win7 x64安裝解壓版mysql 5.7.18 winx64出現(xiàn)服務(wù)無法啟動問題
這篇文章主要介紹了解決Win7 x64安裝解壓版mysql 5.7.18 winx64出現(xiàn)服務(wù)無法啟動問題,需要的朋友可以參考下2017-05-05
MySQL中的JSON_CONTAINS函數(shù)舉例詳解
這篇文章主要給大家介紹了關(guān)于MySQL中JSON_CONTAINS函數(shù)舉例詳解的相關(guān)資料,MySQL JSON_CONTAINS函數(shù)可用于判斷JSON數(shù)組中是否包含某個元素,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12
windows中同時安裝兩個不同版本的mysql數(shù)據(jù)庫
在項目中可能會用到多個版本的Mysql數(shù)據(jù)庫,尤其是最常用的5版本的和8版本數(shù)據(jù)庫,下面這篇文章主要給大家介紹了關(guān)于windows中同時安裝兩個不同版本的mysql數(shù)據(jù)庫,需要的朋友可以參考下2024-03-03
mysql索引過長Specialed key was too long的解決方法
在創(chuàng)建要給表的時候遇到一個有意思的問題,提示Specified key was too long; max key length is 767 bytes,本文就來介紹一下解決方法,如果你也遇到此類問題,可以參考一下2021-11-11
MySQL數(shù)據(jù)誤刪或者誤更新如何恢復(fù)詳細(xì)步驟(一看就會)
本文主要為開發(fā)人員提供在測試環(huán)境中恢復(fù)近期誤操作的少量數(shù)據(jù)的方法,首先介紹了如何下載并安裝MyFlash工具,然后詳細(xì)講解了如何利用該工具和MySQL的binlog日志來恢復(fù)誤刪或誤更新的數(shù)據(jù),介紹的非常詳細(xì),需要的朋友可以參考下2024-10-10

