簡體   English   中英

在SQL中按/限制執行順序

[英]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_datepublish_date編制索引,則它將按順序掃描publish_date索引,根據條件測試關聯的last_read_date ,如果測試成功,則將article添加到結果集中。 當結果集中有20行時,它將停止並返回它。

如果為last_read_date編制了索引,而publish_datelast_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM