2011-08-09 143 views
7

所以我一直认为看到Extra列中的“Using Where”是件好事。不过,我正在计划为同事解释一个棕色袋午餐解释EXPLAIN,现在我不太确定。 MySQL的医生说这要注意的事项“使用去哪儿”:MySQL优化:EXPLAIN“Extra”列包含“Using Where”

WHERE子句用于限制匹配的行对下一个表或发送到客户端。除非您专门打算从表中读取或检查所有行,否则如果Extra值不是使用where和表连接类型是ALL或索引,则查询中可能有问题。 即使您对WHERE子句的所有部分使用索引,也可能会看到如果列可以为NULL,则使用where。

这使我相信,即使我的WHERE子句仅包含索引的部分,即MySQL的仍然将检查行如果列可以有NULL值。

这是真的吗?如果是这样,如果我不需要它,我应该将列更改为不包含NULL吗?我会看到速度提升吗?

+0

我刚刚做了一个测试:将列从null更改为非null,然后“使用where”消失。 – tomwang1013

回答

5

由于额外需要检查空值条件,可空列会产生开销。如果列不必为空,或者您的要求不允许为空,那么绝对要使列not null

至于指标,取决于指数构造。如果索引用(a,b,c)定义,并且您在where子句中使用b,c,则不能使用此索引,因为a不在场。

+0

嘿@Marc,谢谢你的回复。我了解多部分索引的工作原理。我想我问的是:如果我有一个索引表(a,b,c)和一个查询,如“选择a,b,c从表,其中a =?和b =?和c =?”并且列c是可以为空的,MySQL是否仍然需要检查每一行,或者索引是否完全解决了查询? –

+0

它可以基于a/b部分过滤,但仍然需要与C做额外的工作来检查空值。比没有索引更有效率,当然,但如果所有三列都非空,效率就不那么高。 –