簡體   English   中英

選擇查詢檢查的行數多於表中現有的行數

[英]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工作原理:

  1. 像以前一樣讀取與 WHERE 子句匹配的行。
  2. 對於每一行,記錄一個由排序鍵值和行位置以及查詢所需的列組成的值元組。
  3. 按排序鍵值對元組進行排序
  4. 按排序順序檢索行,但直接從排序的元組中讀取所需的列,而不是再次訪問表。

我認為您的查詢檢查了 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.

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