[英]Select query examines more rows than rows existing in table
數據庫內容只有 9100 篇文章但同時點擊了這個查詢
SELECT *
FROM `ABC`
WHERE st=6 AND publish_on <= '2018-02-01'
ORDER BY rand() LIMIT 5
Query_time: 1.043072 Lock_time: 0.000081 Rows_sent: 5 Rows_examined: 19354
但 :
Select count(*) from ABC;
它返回:
9100
為什么它檢查了 19354 行??
您可以在此鏈接中查看rand()
函數的工作原理。
在此鏈接上,您可以看到ORDER BY
工作原理:
我認為您的查詢檢查了 19354 行(比表行總數更多的行),因為使用order by rand()
的order by rand()
組合, rand() 不是表的列(因此沒有排序鍵)因此 dbms 必須掃描表 1 次以上。 如果您按表的一列排序,我不確定,但可能 dbms 不需要只掃描表 1 次。
此外,執行ORDER BY rand() LIMIT 5
是非常低效的,因為您在僅選擇 5 行之前訂購了 9100 行。
Rows_examined: 19354
這意味着此查詢優化不當。 它檢查19354行以產生結果。
EXPLAIN SELECT輸出只是優化器根據 MySQL 擁有的關於索引中鍵分布的信息,對它認為將匹配搜索條件的索引記錄數做出的猜測。 如您所見,返回的實際行數可能不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.