场景
假设我有一个MySQL查询,其中包含多个WHERE
/ AND
子句。
例如,说我有查询
SELECT * FROM some_table
WHERE col1 = 5
AND col2 = 9
AND col3 LIKE '%string%'
问题
col1 = 5
检查是按顺序进行的,因为它是第一个写入的吗?更重要的是,是否col1 != 5
跳过了其他两项检查?
我问的原因是第三个子句col3 LIKE '%string3%
需要花费更多的时间来运行,我想知道是否应该将它放在最后,因为我不想运行它,如果前两项检查之一为假。
答案 0 :(得分:2)
SQL优化器从整体上查看查询,并尝试确定该查询的最佳查询计划。子句中的竞争顺序无关紧要。
答案 1 :(得分:1)
该查询为 的最佳索引
INDEX(col1, col2) -- in either order
鉴于此,它将肯定同时检查col1
和col2
,以便将行数减少到更小。因此,LIKE
仅在与col1和col2都匹配的几行中发生。 这个动作顺序很可能是最佳的。
通常,最好使用FULLTEXT(col3)
并使用
WHERE col1 = 5
AND col2 = 9
AND MATCH(col3) AGAINST ("+string" IN BOOLEAN MODE)
在这种情况下,我很确定它将以FULLTEXT索引开始以测试col3,希望能得到很少的行来对其他子句进行仔细检查。由于其他各种问题, this 是最佳选择。在col1
和col2
上的任何索引都不会使用。
(到目前为止)一般的陈述是:优化器将首先选择可用于一个AND
的{{1}}子句。从这种意义上说,INDEX
子句的顺序被违反了-作为一种优化。
如果没有合适的索引,那就丢脸了。
有许多种可能性。我很乐意讨论单个查询,但是很难做出太多概括。