就性能而言,like
运算符在应用于具有多个%占位符的字符串时的行为如何?
例如:
select A from table_A where A like 'A%'
选择的时间与
相同select A from table_A where A like 'A%%'
???
答案 0 :(得分:8)
您的疑问:
select A from table_A where A like 'A%'
和
select A from table_A where A like 'A%%'
^ optimizer will remove second redundant %
是等效的,优化器将删除第二个查询中的第二个%
就像它会删除1=1
:
select A from table_A where A like 'A%%' and 1=1
但是,这个查询非常不同:
select A from table_A where A like '%A%'
使用'A%'
时,它会使用索引查找以A
开头的所有内容,就像使用电话簿的人会快速查找名称的开头一样。但是,当使用'%A%'
时,它将扫描整个表,查找包含A
的任何内容,因此速度较慢且没有索引使用。就像你必须在电话簿中找到包含A的每个名字一样,这需要一段时间!
答案 1 :(得分:1)
它会对待它们。如果列A
上有索引,它将使用该索引,就像使用单个通配符一样。但是,如果要添加前导通配符,则无论是否存在索引,都会强制进行表扫描。
答案 2 :(得分:0)
在大多数情况下,您使用的模式不会影响查询的性能。性能的关键是适当使用索引。在您的示例中,列上的索引将运行良好,因为它将搜索以“A”开头的值,然后匹配完整模式。可能存在一些更具挑战性的模式,但它们之间的性能差异可以忽略不计。
有一个重要条件,通配符会损害性能。并且,就在它处于模式的开头时。例如,'%A'不会从索引中获益,因为它表示您希望匹配以任何有效字符开头的任何值。必须评估所有行以满足此条件。