哪个更快 - INSTR或LIKE?

Gre*_*ker 33 mysql sql-like

如果你的目标是测试一个字符串是否存在于MySQL列('varchar','text','blob'等类型)中,以下哪个更快/更有效/更好使用,为什么?

或者,是否有其他方法超过其中任何一个?

INSTR( columnname, 'mystring' ) > 0
Run Code Online (Sandbox Code Playgroud)

VS

columnname LIKE '%mystring%'
Run Code Online (Sandbox Code Playgroud)

raz*_*zed 48

正如kibibu在上面的评论中指出的那样,FULLTEXT搜索绝对会更快.

但是:

mysql> select COUNT(ID) FROM table WHERE INSTR(Name,'search') > 0;
+-----------+
| COUNT(ID) |
+-----------+
|     40735 | 
+-----------+
1 row in set (5.54 sec)

mysql> select COUNT(ID) FROM table WHERE Name LIKE '%search%';
+-----------+
| COUNT(ID) |
+-----------+
|     40735 | 
+-----------+
1 row in set (5.54 sec)
Run Code Online (Sandbox Code Playgroud)

在我的测试中,它们表现完全一样.它们都是不区分大小写的,通常它们执行全表扫描,在处理高性能MySQL时通常是禁止.

除非您在索引列上进行前缀搜索:

mysql> select COUNT(ID) FROM table WHERE Name LIKE 'search%';
+-----------+
| COUNT(ID) |
+-----------+
|         7 | 
+-----------+
1 row in set (3.88 sec)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,只有后缀通配符的LIKE要快得多.

  • +1实际做实验!太多的表现"智慧"是基于本能的 (10认同)

pdo*_*naj 12

MySQL - INSTR vs LOCATE vs LIKE vs REGEXP

对我来说,INSTRLOCATE的表现最快:

# 5.074 sec
SELECT BENCHMARK(100000000,INSTR('foobar','foo'));

# 5.086 sec
SELECT BENCHMARK(100000000,LOCATE('foo','foobar')); 

# 8.990 sec
SELECT BENCHMARK(100000000,'foobar' LIKE '%foo%');

# 14.433 sec
SELECT BENCHMARK(100000000,'foobar' REGEXP 'foo'); 

# 5.5.35-0ubuntu0.12.10.2 
SELECT @@version;
Run Code Online (Sandbox Code Playgroud)

  • 我重复这些测试,看到类似的结果! (2认同)

mjv*_*mjv 11

在"前wilcard"(即"LIKE'%......'"谓词)的情况下,似乎就是这种情况,INSTR和LIKE应该大致相同.

当通配符不是 "前通配符"时,LIKE方法应该更快,除非通配符不是非常有选择性.

通配符类型及其选择性的原因在于具有INSTR()的谓词将系统地导致表扫描(SQL无法对INSTR的语义做出任何假设),从而SQL可以利用其对语义的理解. LIKE谓词可能使用索引来帮助它只测试一组减少的可能匹配.

正如问题本身的评论所示,全文索引会更快.差异取决于文本中单词的具体分布,以及整体表格大小等,但期望从快两倍到可能快10倍.

除了创建这样一个索引的一般开销之外,使用全文索引的一个可能的缺点是,除非在配置此索引时非常小心(例如:定义停用词列表,使用特定的搜索语法来避免屈折形式和类似...),可能会出现FullText提供的结果不符合预期的情况.例如,搜索"SAW"(切割木材的工具),可以获得大量的记录,包括动词"看到",以其各种共轭形式.
当然,全文索引的这些语言感知特征通常可以被覆盖,并且人们可以认为这些特征实际上是有利的,而不是缺点.我只是在这里提到这个,因为我们将它与普通的通配符搜索进行比较.