MySQL 优化:EXPLAIN 中的 "Extra" 列包含 "Using Where"

7
所以,我一直认为在Extra列中看到“Using Where”是一件好事。然而,我正在为我的同事们计划一个关于解释EXPLAIN的午餐会,现在我不太确定了。MySQL文档在关于“Using Where”的注释中说道:
“使用WHERE子句来限制匹配下一张表或发送给客户端的行。除非您明确打算从表中获取或检查所有行,否则如果Extra值不是Using where并且表连接类型是ALL或index,则查询可能存在问题。即使您对WHERE子句的所有部分都使用索引,如果列可以为空,您也可能会看到Using where。”
这让我相信,即使我的WHERE子句只包含索引的一部分,如果列可以有NULL值,MySQL仍然会检查行。
这是真的吗?如果是,那么我应该更改列以不包括NULL吗?我会看到速度提升吗?

我刚刚进行了一个测试:将列从null更改为not null,然后"using where"消失了。 - tomwang1013
1个回答

6

可空列需要额外的开销,因为需要检查是否为空。如果一列不需要为空,或者你的要求不允许为空,则一定要将该列设置为not null

至于索引,取决于索引的构建方式。如果索引定义为(a,b,c),而你在where子句中使用了b,c,则无法使用该索引,因为a没有被使用。


嘿@Marc,感谢您的回复。我了解多部分索引的工作原理。我猜我正在问的是:如果我有一个带有索引(a,b,c)的表格和像“select a,b,c from table where a =?and b =?and c =?”这样的查询,而列c可以为空,MySQL是否仍然必须检查每一行,或者索引会完全解决查询? - Mike Sherov
能够基于a/b部分过滤,但仍需使用C进行额外的空值检查。比没有索引要更有效率,但如果所有三个列都非空,则不如此高效。 - Marc B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接