簡體   English   中英

很小的MySQL表會忽略索引嗎?

[英]Do very small MySQL tables ignore indexes?

在打開log_queries_not_using_indexes ,我注意到一個查詢正在迅速填充慢速查詢日志:

SELECT abc.* FROM abc WHERE abc.id NOT IN ( SELECT DISTINCT abc_id FROM zyx WHERE id = 12345 );

abc很小,只有3行數據。 zyx相對較大,有超過100,000行數據。

abc.id有索引,但是當我EXPLAIN查詢,指數也不會被列在key也不possible_keys 這解釋了為什么查詢顯示在慢速日志中,但是我的問題是,為什么不使用索引?

簡而言之,我有兩個問題:

  1. 很小的表會忽略索引嗎? 我可以理解為什么,在3行數據上使用索引並不會節省很多時間。
  2. 如果是這樣,如何防止該查詢泛濫我的慢查詢日志?

感謝您的時間! :)

其他信息(如果需要):

我已經運行過ANALYZE TABLE abc因為我閱讀過有時可以解決該問題。 自添加索引以來,我還重新啟動了MariaDB。

多個的EXPLAIN :SELECT_TYPE = PRIMARY,表= ABC,類型= ALL,possible_keys = NULL,鍵= NULL,key_len = NULL,REF = NULL,行= 3,備用=使用其中

很小的表會忽略索引嗎?

是。 當可以通過單個磁盤訪問讀取整個表時,執行單獨的磁盤訪問以讀取索引毫無意義。

如果是這樣,如何防止該查詢泛濫我的慢查詢日志?

關閉log_queries_not_using_indexes 這是默認情況下不啟用它的原因之一。

NOT IN ( SELECT ... )優化非常差,尤其是在舊版本中。

更改為此:

SELECT  abc.*
    FROM  abc
    LEFT JOIN  zyx  ON zyx.abc_id = abc.id
    WHERE  zyx.abc_id IS NULL;
AND  zyx.id = 12345 ;

對於zyx,具有INDEX(id, abc_id)INDEX(abc_id, id)

如果zyx.idPRIMARY KEY ,那么您的查詢就沒有多大意義了-為什么要測試一行(12345)?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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