例如,当我有这样的字符串时:
ABBBCSLAK**JDK**ASAAAAFJKDSKJFSDF
当我像这样使用SQL时:
SELECT * FROM table WHERE column LIKE '%JDK%'
服务器到达JDK时会发生什么?它会停止并执行SQL,还是遍历字符串的其余部分然后执行SQL?
当我在与OR连接的SQL语句中有多个LIKE子句时,还会发生什么情况?它可能时会在第一个LIKE子句处停止吗?
编辑:我有这样的SQL。这可能是矫kill过正,但值得一提…每个变量都包含一个表列的LIKE子句循环。它们之间有“或”。我是否将这些“ AND”更改为“ AND”或“ OR”都没有任何区别。
WHERE ($countrySQL) AND ($schools_typeSQL) AND $schoolsSQL AND $schools_facultiesSQL AND $schools_classesSQL ORDER BY
MySQL试图通过预过滤行来提高LIKEB树索引可用时的速度:
LIKE
B树索引特征 A B树索引可以在使用表达式中使用的对列的比较=,>,>=,<,<=,或BETWEEN运营商。LIKE如果to的参数LIKE是一个不以通配符开头的常量字符串,则该索引也可以用于比较。例如,以下SELECT语句使用索引: SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%'; SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%'; 在第一条语句中,仅考虑’Patrick’<= key_col <’Patricl’的行。在第二条语句中,仅考虑’Pat’<= key_col <’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算法 初始化字符串的模式,然后使用该模式更快地执行搜索。
A B树索引可以在使用表达式中使用的对列的比较=,>,>=,<,<=,或BETWEEN运营商。LIKE如果to的参数LIKE是一个不以通配符开头的常量字符串,则该索引也可以用于比较。例如,以下SELECT语句使用索引:
=
>
>=
<
<=
BETWEEN
SELECT
SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%'; SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';
在第一条语句中,仅考虑’Patrick’<= key_col <’Patricl’的行。在第二条语句中,仅考虑’Pat’<= key_col <’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算法 初始化字符串的模式,然后使用该模式更快地执行搜索。
LIKE '%string%'
如果您有多个相互OR关联的字词,查询优化将尝试查找最佳查询路径,并可能重新排列条件,甚至决定逐一处理它们。
OR