我想知道LIKE操作符实际上是如何工作的。它是否只是从字符串的第一个字符开始,然后尝试匹配模式,一个字符向右移动?或者它是否查看%的位置,即如果它发现%是模式的第一个字符,它是否从最右边的字符开始并开始匹配,在每一次成功的匹配中向左移动一个字符?
不是说我现在脑子里有任何用例,只是好奇而已。
编辑:使问题变窄
发布于 2014-04-20 15:40:39
如果列上有索引,将常量字符放在前面将导致dbms使用更有效的搜索/查找算法。但是,即使在最简单的形式下,dbms也必须测试字符。如果它能够发现它在早期不匹配,它可以放弃它并转移到下一个测试。
发布于 2014-04-20 15:24:05
LIKE搜索条件使用通配符搜索字符串中的模式。例如:
WHERE name LIKE 'Mickey%'将找到以“Mickey”开头的所有值,这些值后面跟着任意数量的字符。%不区分大小写,也不区分重音,您可以使用多个%,例如
WHERE name LIKE '%mouse%'将返回包含“鼠标”(或“鼠标”或“mousé”)的所有值。
%是包括在内的,意思是
WHERE name like '%A%'将返回以“A”开头、包含“A”或以“A”结尾的所有内容。
可以对单个位置上的任何字符使用_(下划线):
WHERE name LIKE '_at%'会给你所有的价值,'a‘作为第二个字母,'t’作为第三个字母。第一个字母可以是任何东西。例如:“蝙蝠侠”
在T中,如果使用[],可以在范围内找到值。
WHERE name LIKE '[c-f]%'它将找到以c和f之间的字母开头的任何值,包括。这意味着它将返回以c,d,e或f开头的任何值。此[]仅为This。使用^查找不在范围内的值。
查找包含数字的所有值:
WHERE name LIKE '%[0-9]%'返回包含数字的所有内容。示例:“Godfather2”
如果您正在寻找所有具有第三个位置的值为'-‘(破折号),请使用两个下划线:
WHERE NAME '__-%'它将返回,例如:“Lo”。
查找名称以“xyz”结尾的值:
WHERE name LIKE '%xyz'返回以“xyz”结尾的任何内容。
在名称中查找%符号使用括号:
WHERE name LIKE '%[%]%'将返回例如:“顶级%电影”
搜索[使用它周围的括号:
WHERE name LIKE '%[[]%'给出的结果如下:“纽约”
数据库排序规则的排序顺序确定字符范围的大小写敏感性和排序顺序。您可以选择使用排序规则来指定LIKE运算符使用的排序规则排序顺序。
发布于 2014-04-20 15:32:37
通常,主要的性能瓶颈是IO。只有当整个表适合内存时,类似操作符的效率才会很重要,否则IO将占用大部分时间。
AFAIK oracle可以使用索引进行前缀匹配。(如'abc%'),但这些索引不能用于更复杂的表达式。无论如何,如果您只有这类查询,您应该考虑在相关列上使用一个简单的索引。(可能其他RDBMS也是如此。)
否则,像运算符一般都比较慢,但是大多数RDBMS都有某种全文搜索解决方案。我认为缓慢的主要原因是喜欢太笼统了。通常,全文索引有很多不同的选项,这些选项可以告诉数据库您真正想要搜索什么,使用这些附加信息,DB可以以更高效的方式完成其任务。
作为经验法则,我认为如果您想在文本字段中搜索并且认为性能可能是一个问题,您应该考虑RDBMS的全文搜索解决方案,或者真正的目标不是文本搜索,但这是某种“设计副作用”,例如存储在字段中的xml/json/statuses作为文本,那么您可能应该考虑选择一个更高效的数据存储选项。(如果有.)
https://stackoverflow.com/questions/23183358
复制相似问题