是否按顺序检查MySQL中的多个WHERE / AND子句?如果第一个为假,是否会跳过后续检查?

时间:2018-11-23 13:47:56

标签: mysql performance

场景

假设我有一个MySQL查询,其中包含多个WHERE / AND子句。

例如,说我有查询

SELECT * FROM some_table
WHERE col1 = 5
AND col2 = 9
AND col3 LIKE '%string%'

问题

col1 = 5检查是按顺序进行的,因为它是第一个写入的吗?更重要的是,是否col1 != 5跳过了其他两项检查?

我问的原因是第三个子句col3 LIKE '%string3%需要花费更多的时间来运行,我想知道是否应该将它放在最后,因为我不想运行它,如果前两项检查之一为假。

2 个答案:

答案 0 :(得分:2)

SQL优化器从整体上查看查询,并尝试确定该查询的最佳查询计划。子句中的竞争顺序无关紧要。

答案 1 :(得分:1)

该查询为 的最佳索引

INDEX(col1, col2)   -- in either order

鉴于此,它将肯定同时检查col1col2 ,以便将行数减少到更小。因此,LIKE仅在与col1和col2都匹配的几行中发生。 这个动作顺序很可能是最佳的。

通常,最好使用FULLTEXT(col3)并使用

WHERE col1 = 5
  AND col2 = 9
  AND MATCH(col3) AGAINST ("+string" IN BOOLEAN MODE)

在这种情况下,我很确定它将以FULLTEXT索引开始以测试col3,希望能得到很少的行来对其他子句进行仔细检查。由于其他各种问题, this 是最佳选择。在col1col2上的任何索引都不会使用。

(到目前为止)一般的陈述是:优化器将首先选择可用于一个AND的{​​{1}}子句。从这种意义上说,INDEX子句的顺序被违反了-作为一种优化。

如果没有合适的索引,那就丢脸了。

许多种可能性。我很乐意讨论单个查询,但是很难做出太多概括。