[英]Order by / limit execution in SQL
網絡上已經有很多線程,只是試圖了解一些讓我感到困惑的細微差別!
引用文檔參考
如果將LIMIT row_count與ORDER BY結合使用,MySQL會在找到排序結果的前row_count行后立即停止排序,而不是對整個結果進行排序。 如果通過使用索引進行排序,這將非常快。
和一個SO線程
它將先排序,然后得到前20。數據庫還將在ORDER BY之前處理WHERE子句中的任何內容。
從問題中獲取相同的查詢:
SELECT article
FROM table1
ORDER BY publish_date
LIMIT 20
可以說表有2000行,現在query
應該返回20行,現在,查看mysql ref ....stops sorting as soon as it has found the first row_count rows....
讓我感到困惑,因為我發現它很少曖昧!!
為什么說stops sorting
? 是不是將limit
子句應用於通過order by
子句返回的已經排序的數據( 假設其是non-indexed
列 ),或者我的理解是錯誤的,並且SQL先limit
然后排序!!
文檔中提到的優化通常僅在publish_date
列上有索引時才有效。 這些值按順序存儲在索引中,因此引擎僅簡單地遍歷該列的索引,以獲取關聯的行,直到已獲取20行。
如果該列未建立索引,則引擎通常需要獲取所有行,對它們進行排序,然后返回其中的前20行。
了解它與WHERE
條件如何相互作用也很有用。 假設查詢是:
SELECT article
FROM table1
WHERE last_read_date > '2018-11-01'
ORDER BY publish_date
LIMIT 20
如果為publish_date
編制了索引,而last_read_date
為publish_date
編制索引,則它將按順序掃描publish_date
索引,根據條件測試關聯的last_read_date
,如果測試成功,則將article
添加到結果集中。 當結果集中有20行時,它將停止並返回它。
如果為last_read_date
編制了索引,而publish_date
為last_read_date
編制索引,則它將使用last_read_date
索引查找滿足條件的所有行的子集。 然后,它將使用publish_date
列對這些行進行排序,並publish_date
返回前20行。
如果兩個索引都沒有索引,它將進行全表掃描以測試last_read_date
,對所有符合條件的行進行排序,然后返回該行的前20行。
MySQL在找到排序結果的前row_count行后立即停止排序,而不是對整個結果進行排序
這實際上是mysql中非常明智的優化。 如果您使用limit返回20行,而mysql知道已經找到了它們,那么mysql(或您)為什么會關心其余記錄的排序方式呢? 沒關系,因此mysql停止對其余行進行排序。
如果排序依據是在索引列上完成的,則mysql可以很迅速地判斷出是否找到了前n條記錄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.