【问题标题】:MySQL Optimization: EXPLAIN "Extra" column contains "Using Where"MySQL 优化:EXPLAIN “Extra”列包含“Using Where”
【发布时间】:2011-10-23 14:58:41
【问题描述】:

所以我一直认为在 Extra 列中看到“Using Where”是一件好事。然而,我正计划为我的同事准备一个棕色袋子午餐来解释解释,现在我不太确定。 MySQL 文档在有关“使用位置”的注释中说明了这一点:

WHERE 子句用于限制与下一个表匹配或发送到客户端的行。除非您特别打算从表中获取或检查所有行,否则如果 Extra 值不是 Using where 并且表连接类型是 ALL 或索引,则您的查询可能有问题。 即使您对 WHERE 子句的所有部分都使用索引,您也可能会看到 Using where if the column can be NULL.

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

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

【问题讨论】:

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

标签: mysql database-optimization database-indexes


【解决方案1】:

可空列确实有开销,因为额外需要检查空条件。如果列不必为空,或者您的要求不允许为空,那么一定要创建列not null

至于索引,取决于索引的构建。如果索引是用(a,b,c) 定义的,并且您在where 子句中使用b,c,则不能使用该索引,因为a 不在使用中。

【讨论】:

  • 嘿@Marc,感谢您的回复。我了解多部分索引的工作原理。我想我要问的是:如果我有一个带有索引 (a,b,c) 的表和一个查询,例如“从 a=? 和 b=? 和 c=? 的表中选择 a,b,c”并且 c 列可以为空,MySQL 是否仍然需要检查每一行,或者索引是否完全解析查询?
  • 它可以部分基于 a/b 进行过滤,但仍然需要使用 C 进行额外的工作来检查空值。肯定比没有索引更有效,但如果所有三列都不为空,则效率不高。
猜你喜欢
  • 2020-11-06
  • 2013-12-13
  • 2021-08-09
  • 2011-06-14
  • 1970-01-01
  • 2016-06-11
  • 1970-01-01
  • 2021-11-16
  • 2015-09-14
相关资源
最近更新 更多