如果标准明显匹配列中的所有案例,MySQL是否会忠实地执行搜索

时间:2011-10-21 07:00:09

标签: mysql performance

我想知道如果该条件覆盖了列中的所有可能值,是否需要设置条件语句来删除条件。示例如下:

SELECT product FROM Table where condition = 'condition' AND class <= 255;

我们说类列是TINYINT unsigned NOT NULL DEFAULT 0。 MySQL是否仍会忠实地扫描列以检查class <= 255?假设我有1000万行,上面的查询如何执行以下语句?

SELECT product FROM Table where condition = 'condition';

在我自己的数据库上进行一些测试之后,我意识到MySQL 在整个专栏中忠实地扫描,尽管很明显搜索会返回整个列。我案例的性能差异大致为几秒。两个查询计划之间没有区别。

我想进一步补充说明,下面还会进行扫描:

SELECT product FROM Table where condition = 'condition' AND class >= 0;

我不确定为什么这样的查询没有被MySQL优化。我希望有人可以给我一个答案。谢谢:))

1 个答案:

答案 0 :(得分:0)

MySQL不会消除非敏感标准,例如无符号整数列上的class >= 0

这是MySQL所做的所有where优化的列表:
http://dev.mysql.com/doc/refman/5.0/en/where-optimizations.html

然而,MySQL确实检测到class >= 0会有很多命中,并且不会尝试使用索引 就condition = 'condition'子句而言,它是否使用索引取决于该列的基数 超过20%的行符合条件,将执行全表扫描,否则将使用索引。

如果两个条件都可以使用索引,则将使用具有最高预期基数的索引 MySQL每个subselect / join每个表只能使用一个索引。

MySQL不会消除评估标准,但会对AND和OR执行短路布尔评估 因此避免全表扫描如果它可以使用condition上的索引。

如果MySQL进行全表扫描
它必须仅针对匹配class但不适用于所有行的行condition进行其他测试。
查询优化器将按照产生最快结果的顺序评估子句,因此它应首先评估condition(因为它是=比较),然后评估class(因为它的&gt; ;用低值测试。)