非常小的MySQL表会忽略索引吗?

非常小的MySQL表会忽略索引吗?,mysql,mariadb,Mysql,Mariadb,在使用索引打开log_querys_not_后,我注意到一个查询正在快速填充慢速查询日志: 从abc中选择abc.* abc.id在哪里 不在 从zyx中选择不同的abc_id 其中id=12345 ; abc非常小,只有3行数据。zyx相对较大,有超过100000行的数据 id有一个索引,但是当我解释查询时,索引既没有列在key下,也没有列在可能的_键下。这解释了为什么查询会显示在慢速日志中,但我的问题是,为什么不使用索引 简言之,我有两个问题: 非常小的表会忽略索引吗?我可以理解为什么对3行

在使用索引打开log_querys_not_后,我注意到一个查询正在快速填充慢速查询日志:

从abc中选择abc.* abc.id在哪里 不在 从zyx中选择不同的abc_id 其中id=12345 ;

abc非常小,只有3行数据。zyx相对较大,有超过100000行的数据

id有一个索引,但是当我解释查询时,索引既没有列在key下,也没有列在可能的_键下。这解释了为什么查询会显示在慢速日志中,但我的问题是,为什么不使用索引

简言之,我有两个问题:

非常小的表会忽略索引吗?我可以理解为什么对3行数据使用索引不会节省很多时间。 如果是这样,如何防止此查询淹没我的慢速查询日志? 谢谢你抽出时间!:

其他信息(如需要):

我已经运行了分析表abc,正如我所读到的,有时会修复这个问题。自从添加索引之后,我也重新启动了MariaDB

更多解释:选择_type=PRIMARY,table=abc,type=ALL,可能的_-keys=NULL,key=NULL,key_-len=NULL,ref=NULL,rows=3,Extra=Using where

非常小的表会忽略索引吗

对。当整个表可以在一次磁盘访问中读取时,执行单独的磁盘访问来读取索引是没有意义的

如果是这样,如何防止此查询淹没我的慢速查询日志

使用索引关闭日志查询。这是默认情况下不启用的原因之一

非常小的表会忽略索引吗

对。当整个表可以在一次磁盘访问中读取时,执行单独的磁盘访问来读取索引是没有意义的

如果是这样,如何防止此查询淹没我的慢速查询日志

使用索引关闭日志查询。这是默认情况下不启用的原因之一。

不在选择中。。。优化效果非常差,尤其是在旧版本中

更改为:

SELECT  abc.*
    FROM  abc
    LEFT JOIN  zyx  ON zyx.abc_id = abc.id
    WHERE  zyx.abc_id IS NULL;
AND  zyx.id = 12345 ;
对于zyx,具有INDEXid、abc_id或INDEXabc_id、id

如果zyx.id是主键,那么您的查询没有多大意义-为什么要测试一行12345?

不在选择中。。。优化效果非常差,尤其是在旧版本中

更改为:

SELECT  abc.*
    FROM  abc
    LEFT JOIN  zyx  ON zyx.abc_id = abc.id
    WHERE  zyx.abc_id IS NULL;
AND  zyx.id = 12345 ;
对于zyx,具有INDEXid、abc_id或INDEXabc_id、id


如果zyx.id是主键,那么您的查询就没有多大意义-为什么要测试一行12345?

这与小表上缺少索引导致查询速度变慢非常不同。zyx.id上有索引吗?@uuerdo操作并不意味着查询速度慢;只是它出现在慢速查询日志中。它记录所有符合特定条件的查询,而不仅仅是那些实际需要花费大量时间的查询。@Dashwuff啊,没错;我忽略了他从未真正说过查询本身很慢。@uuerdo是的,zyx.id和zyx.abc_id上有一个索引,EXPLAIN表示它正在使用一个索引。这与小表上缺少索引导致查询速度慢有很大不同。zyx.id上有索引吗?@uuerdo操作并不意味着查询速度慢;只是它出现在慢速查询日志中。它记录所有符合特定条件的查询,而不仅仅是那些实际需要花费大量时间的查询。@Dashwuff啊,没错;我忽略了他实际上从未说过查询本身很慢。@uuerdo是的,zyx.id和zyx.abc_id上有一个索引,EXPLAIN表示它正在使用索引。