MySQL查詢中LIMIT的大offset導(dǎo)致性能低下淺析
前言
我們大家都知道,mysql查詢使用select命令,配合limit,offset參數(shù)可以讀取指定范圍的記錄,但是offset過大影響查詢性能的原因及優(yōu)化方法
我們?cè)跇I(yè)務(wù)系統(tǒng)中難免少不了分頁的需求。想到分頁的時(shí)候,大家肯定會(huì)想到使用SQL中的LIMIT來實(shí)現(xiàn)。但是,如果不正確的使用LIMIT會(huì)導(dǎo)致性能問題(SQL執(zhí)行得很慢、有可能會(huì)拖垮服務(wù)器),也會(huì)被領(lǐng)導(dǎo)批的;所以,我們來看看如何正確地使用LIMIT。
下面話不多說了,來一起看看詳細(xì)的介紹吧
LIMIT OFFSET, ROW_COUNT 實(shí)現(xiàn)分頁
存在性能問題的方式
SELECT * FROM myTable ORDER BY `id` LIMIT 1000000, 30
寫出這樣SQL語句的人肯定心里是這樣想的:MySQL數(shù)據(jù)庫會(huì)直接定位到符合條件的第1000000位,然后再取30條數(shù)據(jù)。
然而,實(shí)際上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í)際的數(shù)據(jù),所以不涉及到磁盤IO,所以即使是比較大的 offset,查詢速度也不會(huì)太差。
對(duì)具體的原理分析感興趣的朋友可以看看這篇文章: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)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
淺析mysql.data.dll驅(qū)動(dòng)各版本介紹
本較詳細(xì)的給大家介紹了mysql.data.dll驅(qū)動(dòng)各版本的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-07-07Mysql實(shí)現(xiàn)模糊查詢的兩種方式(like子句?、正則表達(dá)式)
通配符是一種特殊語句,主要用來模糊查詢,下面這篇文章主要給大家介紹了關(guān)于給Mysql實(shí)現(xiàn)模糊查詢的兩種方式,分別是like子句?、正則表達(dá)式,需要的朋友可以參考下2022-09-09Mysql中JDBC的三種查詢(普通、流式、游標(biāo))詳解
這篇文章主要介紹了Mysql中JDBC的三種查詢(普通、流式、游標(biāo))詳解,JDBC(Java DataBase Connectivity:java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的Java API,可以為多種關(guān)系型數(shù)據(jù)庫提供統(tǒng)一訪問,它是由一組用Java語言編寫的類和接口組成的,需要的朋友可以參考下2023-08-08GDB調(diào)試Mysql實(shí)戰(zhàn)之源碼編譯安裝
今天小編就為大家分享一篇關(guān)于GDB調(diào)試Mysql實(shí)戰(zhàn)之源碼編譯安裝,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02MySQL自定義序列數(shù)的實(shí)現(xiàn)方式
這篇文章主要介紹了MySQL自定義序列數(shù)的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12