MySQL LIKE vs LOCATE

Gho*_*ngi 20 mysql

有谁知道哪一个更快:

SELECT * FROM table WHERE column LIKE '%text%';
Run Code Online (Sandbox Code Playgroud)

要么

SELECT * FROM table WHERE LOCATE('text',column)>0;
Run Code Online (Sandbox Code Playgroud)

Mch*_*chl 21

2015年4月20日新增:请阅读下面的Hallie答案


第一个但很少.主要是因为它不需要做额外的> 0比较.

mysql> SELECT BENCHMARK(100000000,LOCATE('foo','foobar'));
+---------------------------------------------+
| BENCHMARK(100000000,LOCATE('foo','foobar')) |
+---------------------------------------------+
|                                           0 |
+---------------------------------------------+
1 row in set (3.24 sec)

mysql> SELECT BENCHMARK(100000000,LOCATE('foo','foobar') > 0);
+-------------------------------------------------+
| BENCHMARK(100000000,LOCATE('foo','foobar') > 0) |
+-------------------------------------------------+
|                                               0 |
+-------------------------------------------------+
1 row in set (4.63 sec)


mysql> SELECT BENCHMARK(100000000,'foobar' LIKE '%foo%');
+--------------------------------------------+
| BENCHMARK(100000000,'foobar' LIKE '%foo%') |
+--------------------------------------------+
|                                          0 |
+--------------------------------------------+
1 row in set (4.28 sec)


mysql> SELECT @@version;
+----------------------+
| @@version            |
+----------------------+
| 5.1.36-community-log |
+----------------------+
1 row in set (0.01 sec)
Run Code Online (Sandbox Code Playgroud)


Bil*_*win 5

+1到@Mchl最直接回答问题.

但是我们应该记住,这两种解决方案都不能使用索引,所以它们必然会进行表扫描.

当你试图修补泰坦尼克号的船体时,试图在布或塑料胶粘绷带之间做出决定是有点愚蠢的.

对于这种类型的查询,需要全文搜索索引.根据表的大小,这将快几百或几千倍.

  • MySQL中全文的问题是它目前不能进行通配符搜索,只有前缀搜索(`foo*`匹配`foobar`,但`*bar`不会). (2认同)