Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 类似'的性能;xyz%';v/s类';%xyz';_Mysql_Sql_Oracle_Tsql_Sql Like - Fatal编程技术网

Mysql 类似'的性能;xyz%';v/s类';%xyz';

Mysql 类似'的性能;xyz%';v/s类';%xyz';,mysql,sql,oracle,tsql,sql-like,Mysql,Sql,Oracle,Tsql,Sql Like,我想知道LIKE操作符实际上是如何工作的。 它是否只是从字符串的第一个字符开始,然后尝试匹配模式,一个字符向右移动?或者它是否查看%的位置,即,如果它发现%是模式的第一个字符,它是否从最右边的字符开始匹配,并在每次成功匹配时向左移动一个字符 我现在脑子里并没有任何用例,只是好奇而已 edit:使问题缩小相似搜索条件使用通配符搜索字符串中的模式。例如: WHERE name LIKE 'Mickey%' 将查找以“Mickey”开头的所有值(可选后跟任意数量的字符)。%不区分大小写,也不区分重音

我想知道
LIKE
操作符实际上是如何工作的。 它是否只是从字符串的第一个字符开始,然后尝试匹配模式,一个字符向右移动?或者它是否查看
%
的位置,即,如果它发现
%
是模式的第一个字符,它是否从最右边的字符开始匹配,并在每次成功匹配时向左移动一个字符

我现在脑子里并没有任何用例,只是好奇而已


edit:使问题缩小

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

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 '[c-f]%'
查找包含数字的所有值:

WHERE name LIKE '%[0-9]%'
返回包含数字的所有内容。例如:“教父2”

如果要查找第3个位置为“-”(破折号)的所有值,请使用两个下划线:

WHERE NAME '__-%'
它将返回例如:“Lo Res”

查找名称为“xyz”的值使用:

WHERE name LIKE '%xyz'
返回以“xyz”结尾的任何内容

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

WHERE name LIKE '%[%]%'
将返回例如:“前%Movies”

搜索[在其周围使用括号:

WHERE name LIKE '%[[]%'
给出的结果为:“纽约[纽约]”


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

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

AFAIK oracle可以使用索引进行前缀匹配(如“abc%”),但这些索引不能用于更复杂的表达式。 不管怎样,如果你只有这样的查询,你应该考虑在相关列上使用一个简单的索引。 否则,LIKE运算符通常比较慢,但大多数RDBMS都有某种全文搜索解决方案。我认为这种慢的主要原因是LIKE太笼统了。通常,全文索引有很多不同的选项,可以告诉数据库您真正想要搜索的内容,并且有了这些附加信息,数据库能够以更有效的方式完成任务


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

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

您的个人测试是什么告诉你?答案部分取决于你所说的数据库产品。MySQL、Oracle或SQL Server?谢谢@J3ffk,我知道like运算符,我正在寻找db在评估这些条件时所做的性能和优化,而不是专门回答你的问题;至于你问题中的性能部分,我会建议在示例数据库上进行测试,并使用上述选项测量性能。感谢@Lajos,我缩小了我的问题范围,我想了解条件为+1的StartWith和endsWith之间的差异……这是唯一提到索引的答案。
Like
可以在通配符不在列表开头时使用索引字符串--一个非常重要的性能考虑因素。