MySQL查詢中LIMIT的大offset會導致效能低下
前言
在業務系統中難免少不了分頁的需求。想到分頁的時候,大家肯定會想到使用SQL中的LIMIT來實現。但是,如果不正確的使用LIMIT會導致效能問題(SQL執行得很慢、有可能會拖垮伺服器),也會被領導批的;所以,我們來看看如何正確地使用LIMIT。
LIMIT OFFSET, ROW_COUNT 實現分頁
存在效能問題的方式
SELECT * FROM myTable ORDER BY `id` LIMIT 1000000, 30
寫出這樣SQL語句的人肯定心裡是這樣想的:MySQL資料庫會直接定位到符合條件的第1000000位,然後再取30條資料。
然而,實際上MySQL不是這樣工作的。
LIMIT 1000000, 30
的意思是:掃描滿足條件的1000030行,扔掉前面的1000000行,然後返回最後的30行。
較好的方式
SELECTt.* FROM( SELECTid FROMmyTable ORDER BY id LIMIT 1000000, 30 ) q JOINmyTable t ONt.id = q.id
大概的原理是:
- 子查詢只用到了索引列,沒有取實際的資料,所以不涉及到磁碟IO,所以即使是比較大的 offset,查詢速度也不會太差。
對具體的原理分析感興趣的朋友可以看看這篇文章:ofollow,noindex">MySQL ORDER BY / LIMIT performance: late row lookups
後記
未完待續。