如果你的目标是测试一个字符串是否存在于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要快得多.
pdo*_*naj 12
MySQL - INSTR vs LOCATE vs LIKE vs REGEXP
对我来说,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;
Run Code Online (Sandbox Code Playgroud)
mjv*_*mjv 11
在"前wilcard"(即"LIKE'%......'"谓词)的情况下,似乎就是这种情况,INSTR和LIKE应该大致相同.
当通配符不是 "前通配符"时,LIKE方法应该更快,除非通配符不是非常有选择性.
通配符类型及其选择性的原因在于具有INSTR()的谓词将系统地导致表扫描(SQL无法对INSTR的语义做出任何假设),从而SQL可以利用其对语义的理解. LIKE谓词可能使用索引来帮助它只测试一组减少的可能匹配.
正如问题本身的评论所示,全文索引会更快.差异取决于文本中单词的具体分布,以及整体表格大小等,但期望从快两倍到可能快10倍.
除了创建这样一个索引的一般开销之外,使用全文索引的一个可能的缺点是,除非在配置此索引时非常小心(例如:定义停用词列表,使用特定的搜索语法来避免屈折形式和类似...),可能会出现FullText提供的结果不符合预期的情况.例如,搜索"SAW"(切割木材的工具),可以获得大量的记录,包括动词"看到",以其各种共轭形式.
当然,全文索引的这些语言感知特征通常可以被覆盖,并且人们可以认为这些特征实际上是有利的,而不是缺点.我只是在这里提到这个,因为我们将它与普通的通配符搜索进行比较.
归档时间: |
|
查看次数: |
33107 次 |
最近记录: |