SQL LIKE实际上是如何工作的

时间:2014-08-06 22:03:02

标签: mysql sql

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

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

2 个答案:

答案 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具有此列的索引)。