LIKE'xyz%'v / s LIKE'%xyz'的表现

时间:2014-04-20 14:06:00

标签: mysql sql oracle tsql sql-like

我想知道LIKE运营商是如何运作的。 它只是从字符串的第一个字符开始并尝试匹配模式,一个字符向右移动?或者它是否会查看%的位置,即如果它发现%是模式的第一个字符,它是从最右边的字符开始并开始匹配,将一个字符移动到每次成功比赛的左边?

不是说我现在脑子里有任何用例,只是好奇。

编辑缩小了问题

3 个答案:

答案 0 :(得分:1)

如果列上有索引,则在前面放置常量字符将使dbms使用更有效的搜索/搜索算法。但即使是最简单的形式,dbms也必须测试字符。如果它能够在早期找到它并不匹配,它可以丢弃它并进入下一个测试。

答案 1 :(得分:0)

LIKE搜索条件使用通配符来搜索字符串中的模式。例如:

WHERE name LIKE 'Mickey%'

将找到以“Mickey”开头的所有值,可选地后跟任意数量的字符。 %不区分大小写且不区分重音,您可以使用多个%,例如

WHERE name LIKE '%mouse%'

将使用'mouse'(或'Mouse'或'mousé')返回所有值。

%是包容性的,意思是

WHERE name like '%A%'

将返回以“A”开头,包含“A”或以“A”结尾的所有内容。

您可以对单个位置的任何字符使用_(下划线):

WHERE name LIKE '_at%'

将为您提供所有值,其中'a'作为第二个字母,'t'作为第三个字母。第一个字母可以是任何东西。例如:'蝙蝠侠'

在T-SQL中,如果使用[],则可以找到范围内的值。

WHERE name LIKE '[c-f]%'

它会找到以c和f之间的字母开头的任何值,包括在内。这意味着它将返回以c,d,e或f开头的任何值。这个[]只是T-SQL。使用[^]查找不在范围内的值。

查找包含数字的所有值:

WHERE name LIKE '%[0-9]%'

返回包含数字的所有内容。示例:'Godfather2'

如果您要查找第3个位置的所有值为' - '(短划线),请使用两个下划线:

WHERE NAME '__-%'

它将返回例如:'Lo-Res'

查找名称以'xyz'结尾的值使用:

WHERE name LIKE '%xyz'

返回以'xyz'结尾的任何内容

在名称中查找%符号使用括号:

WHERE name LIKE '%[%]%'

将返回例如:'Top%Movies'

搜索[围绕它使用括号:

WHERE name LIKE '%[[]%'

将结果表示为:'New York [NY]'

数据库排序规则的排序顺序决定了区分大小写和字符范围的排序顺序。您可以选择使用COLLATE指定LIKE运算符使用的排序规则排序顺序。

答案 2 :(得分:0)

通常主要的性能瓶颈是IO。 LIKE运算符的效率只有在整个表适合内存时才有用,否则IO将占用大部分时间。

AFAIK oracle可以使用索引进行前缀匹配。 (比如'abc%'),但这些索引不能用于更复杂的表达式。 无论如何,如果您只有这种查询,您应该考虑在相关列上使用简单索引。 (对于其他RDBMS也可能如此。)

否则LIKE运算符通常很慢,但大多数RDBMS都有某种全文搜索解决方案。我认为缓慢的主要原因是LIKE过于笼统。通常,全文索引有许多不同的选项,可以告诉数据库您真正想要搜索的内容,通过这些附加信息,DB可以更有效地完成任务。

根据经验,我认为如果你想在文本字段中搜索而你认为性能可能是一个问题,你应该考虑你的RDBMS的全文搜索解决方案,或者真正的目标不是文本搜索,但这是某种“设计副作用”,例如存储在字段中的xml / json / status作为文本,那么您可能应该考虑选择更有效的数据存储选项。 (如果有的话......)