我想知道如果该条件覆盖了列中的所有可能值,是否需要设置条件语句来删除条件。示例如下:
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优化。我希望有人可以给我一个答案。谢谢:))
答案 0 :(得分:0)
MySQL不会消除非敏感标准,例如无符号整数列上的class >= 0
。
这是MySQL所做的所有where
优化的列表:
http://dev.mysql.com/doc/refman/5.0/en/where-optimizations.html
class >= 0
会有很多命中,并且不会尝试使用索引
就condition = 'condition'
子句而言,它是否使用索引取决于该列的基数
超过20%的行符合条件,将执行全表扫描,否则将使用索引。
如果两个条件都可以使用索引,则将使用具有最高预期基数的索引 MySQL每个subselect / join每个表只能使用一个索引。
MySQL不会消除评估标准,但会对AND和OR执行短路布尔评估
因此将避免全表扫描如果它可以使用condition
上的索引。
如果MySQL进行全表扫描
它必须仅针对匹配class
但不适用于所有行的行condition
进行其他测试。
查询优化器将按照产生最快结果的顺序评估子句,因此它应首先评估condition
(因为它是=
比较),然后评估class
(因为它的&gt; ;用低值测试。)