例如,当我有这样的字符串时:
ABBBCSLAK**JDK**ASAAAAFJKDSKJFSDF
当我像这样使用SQL时:
SELECT * FROM table WHERE column LIKE '%JDK%'
当服务器到达JDK时到底发生了什么?它是停止并执行SQL还是通过字符串的其余部分然后执行SQL?
当我在与OR连接的SQL语句中有多个LIKE子句时会发生什么?它是否可以在第一个LIKE子句停止时停止?
编辑: 我有这样的SQL。它可能有点过分但很好......每个变量都包含一个表列的LIKE子句循环。他们有" OR"在他们之间。我是否改变了这些" ANDs"到" AND"或"或"没有任何区别。
WHERE
($countrySQL)
AND
($schools_typeSQL)
AND
$schoolsSQL
AND
$schools_facultiesSQL
AND
$schools_classesSQL
ORDER BY
答案 0 :(得分:4)
MySQL通过预过滤行来尝试improve the speed of LIKE
when a B-Tree index is available:
B树索引特征
B树索引可用于使用
=
,>
,>=
,<
,<=
的表达式中的列比较,或者BETWEEN
运营商。如果LIKE
的参数是不以通配符开头的常量字符串,则索引也可用于LIKE
比较。例如,以下SELECT
语句使用索引:SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%'; SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';
在第一个语句中,只有'Patrick'&lt; = key_col&lt;的行'Patricl'被认为是。在第二个语句中,只有'Pat'&lt; = key_col&lt;的行'Pau'被认为是。
以下SELECT语句不使用索引:
SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%'; SELECT * FROM tbl_name WHERE key_col LIKE other_col;
在第一个语句中,LIKE值以通配符开头。在第二个语句中,LIKE值不是常量。
如果您使用...
LIKE '%string%'
且字符串长度超过三个字符,MySQL会使用 Turbo Boyer-Moore算法来初始化字符串的模式,然后使用此模式更快地执行搜索。
如果您有多个OR
- 连接的术语,查询优化将尝试找到最佳查询路径,并可能重新排序条件甚至决定逐个处理它们。有关详细信息,请参阅this question。
答案 1 :(得分:0)
当然,这取决于数据库管理系统(DMBS)的实现。
但是,大多数DBMS都针对性能进行了优化,因此它们使用短路。即如果(a OR B)中的一个参数为真,它将停止评估其余参数,因为它已经是真的。对于(A和B),如果A为假,则不需要检查B,因为整个表达式不能再为真。
同样适用于LIKE运算符。如果已找到匹配项,则无需继续检查字符串。
除此之外: SQL是一种声明性的“语言”,因此,您不知道它是否被DBMS更改/优化为更好的语言(例如,首先检查另一列,因为DBMS具有此列的索引)。