如果您的目标是测试一个字符串是否存在于MySQL列中(类型为'varchar','text','blob'等),以下哪种方法更快/更有效/更好使用,为什么?
或者,是否有其他方法可以超越这两种方法?
INSTR( columnname, 'mystring' ) > 0
对比
columnname LIKE '%mystring%'
如kibibu在上面的评论中所指出的那样,使用全文搜索绝对会更快。
然而:
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)
在我的测试中,它们的性能表现完全相同。它们都是不区分大小写的,并且通常执行完整表扫描,在处理高性能MySQL时不推荐使用。
除非您正在对已索引列进行前缀搜索:
mysql> select COUNT(ID) FROM table WHERE Name LIKE 'search%';
+-----------+
| COUNT(ID) |
+-----------+
| 7 |
+-----------+
1 row in set (3.88 sec)
如果只使用后缀通配符的LIKE语句会更快。
MySQL - INSTR 与 LOCATE 相比,表现最佳:
# 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;
LIKE 'foo%'
,那么速度比 INSTR
更快。 - endo64regexp
会增加更重的处理负载,而不像Seth在他的评论中指出的那样。query_caching
设置为On
。query_cache_type = 1
query_cache_size = 64M
测试
The timings show the average performance, out of three measurements (with the cache cleared intermittently):
LIKE
SELECT * FROM `domain_model_offers` WHERE `description` LIKE '%inform%' LIMIT 0 , 30
Initial: 0.0035s
Cached: 0.0005s
REGEXP
SELECT * FROM `domain_model_offers` WHERE `description` REGEXP 'inform' LIMIT 0 , 30
Initial: 0.01s
Cached: 0.0004s
结果
LIKE
或 INSTR
的速度肯定比 REGEXP
快。
尽管差别很小,但缓存时间的差异可能足以值得进一步调查。
在一个可能配置良好的MySQL系统上,全文索引通常应该比非索引搜索更快或至少与其相当。因此,在长篇人类语言文本中使用索引,无论间歇标记代码如何。
column regexp 'mystring'
通常比like
更快。 - Seth5
票。能否请您建议将 [tag:sql-like] 作为其 synonym? - KermitPOSITION('mystring' in columnname) > 0
。 - Takedasama