小编典典

SQL LIKE实际如何工作

sql

例如,当我有这样的字符串时:

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

阅读 192

收藏
2021-04-28

共1个答案

小编典典

MySQL试图通过预过滤行来提高LIKEB树索引可用时的速度

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算法
初始化字符串的模式,然后使用该模式更快地执行搜索。

如果您有多个相互OR关联的字词,查询优化将尝试查找最佳查询路径,并可能重新排列条件,甚至决定逐一处理它们。

2021-04-28