打开log_queries_not_using_indexes
后,我注意到一个查询正在快速填满慢速查询日志:
从 abc 中选择 abc.*
哪里 abc.id
不在(
从 zyx 中选择不同的 abc_id
其中 id = 12345
);
abc
很小,只有3行数据。 zyx
相对较大,有超过 100,000 行数据。
abc.id
有一个索引,但是当我 EXPLAIN
查询时,该索引未在 key
和 下列出>possible_keys
。这解释了为什么查询显示在慢速日志中,但我的问题是,为什么它不使用索引?
简而言之,我有两个问题:
- 非常小的表会忽略索引吗?我明白为什么,对 3 行数据使用索引并不能节省太多时间。
- 如果是这样,如何防止此查询淹没我的慢查询日志?
感谢您的宝贵时间! :)
其他信息(如果需要):
我已经运行了ANALYZE TABLE abc
,因为我读到有时会修复该问题。添加索引后我还重新启动了 MariaDB。
更多解释
:select_type=PRIMARY、table=abc、type=ALL、possible_keys=NULL、key=NULL、key_len=NULL、ref=NULL、rows=3、Extra=Using哪里
最佳答案
Do very small tables ignore indexes?
是的。当可以在单个磁盘访问中读取整个表时,执行单独的磁盘访问来读取索引是没有意义的。
If so, how can I prevent this query from flooding my slow query log?
关闭log_queries_not_using_indexes
。这是默认情况下未启用的原因之一。
关于mysql - 非常小的 MySQL 表会忽略索引吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54718517/