![](/img/trans.png)
[英]Why do MySQL InnoDB inserts / updates on large tables get very slow when there are a few indexes?
[英]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
。 這解釋了為什么查詢顯示在慢速日志中,但是我的問題是,為什么不使用索引?
簡而言之,我有兩個問題:
感謝您的時間! :)
其他信息(如果需要):
我已經運行過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.id
是PRIMARY KEY
,那么您的查詢就沒有多大意義了-為什么要測試一行(12345)?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.