를 찾습니다MySQL의 LIKE 대 사람이 하나가 빠르다 알고 있나요
SELECT * FROM table WHERE column LIKE '%text%';
또는
SELECT * FROM table WHERE LOCATE('text',column)>0;
를 찾습니다MySQL의 LIKE 대 사람이 하나가 빠르다 알고 있나요
SELECT * FROM table WHERE column LIKE '%text%';
또는
SELECT * FROM table WHERE LOCATE('text',column)>0;
추가 된 2015 년 4 월 20 : 읽어 보시기 바랍니다 또한 Hallie's answer 아래
먼저 하나 그러나 가장자리로. 대체로 > 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)
나는 Mchi와 같은 몇 가지 테스트를 수행했습니다. 그리고 어느 것이 더 빠르다고 말하는 것이 어렵다고 생각합니다. 하위 문자열의 첫 번째 항목에 따라 모양이 다릅니다.
mysql> select benchmark(100000000, 'afoobar' like '%foo%');
+----------------------------------------------+
| benchmark(100000000, 'afoobar' like '%foo%') |
+----------------------------------------------+
| 0 |
+----------------------------------------------+
1 row in set (9.80 sec)
mysql> select benchmark(100000000, locate('foo', 'afoobar'));
+------------------------------------------------+
| benchmark(100000000, locate('foo', 'afoobar')) |
+------------------------------------------------+
| 0 |
+------------------------------------------------+
1 row in set (8.08 sec)
mysql> select benchmark(100000000, 'abfoobar' like '%foo%');
+-----------------------------------------------+
| benchmark(100000000, 'abfoobar' like '%foo%') |
+-----------------------------------------------+
| 0 |
+-----------------------------------------------+
1 row in set (10.55 sec)
mysql> select benchmark(100000000, locate('foo', 'abfoobar'));
+-------------------------------------------------+
| benchmark(100000000, locate('foo', 'abfoobar')) |
+-------------------------------------------------+
| 0 |
+-------------------------------------------------+
1 row in set (10.63 sec)
mysql> select benchmark(100000000, 'abcfoobar' like '%foo%');
+------------------------------------------------+
| benchmark(100000000, 'abcfoobar' like '%foo%') |
+------------------------------------------------+
| 0 |
+------------------------------------------------+
1 row in set (11.54 sec)
mysql> select benchmark(100000000, locate('foo', 'abcfoobar'));
+--------------------------------------------------+
| benchmark(100000000, locate('foo', 'abcfoobar')) |
+--------------------------------------------------+
| 0 |
+--------------------------------------------------+
1 row in set (12.48 sec)
mysql> select @@version;
+------------+
| @@version |
+------------+
| 5.5.27-log |
+------------+
1 row in set (0.01 sec)
좋은 캐치! 나는 그것을 테스트하는 것에 대해 생각하지 않았다! – Mchl
+1 @ 질문에 가장 직접적으로 대답하는 @Mchl.
그러나 솔루션 중 어느 것도 인덱스를 사용할 수 없으므로 테이블 스캔을 수행해야합니다.
타이타닉의 선체를 패치하려고 할 때 헝겊이나 플라스틱 접착 붕대를 결정하려고하면 바보입니다.
이러한 유형의 쿼리에는 full-text search index이 필요합니다. 표의 크기에 따라 hundreds or thousands of times faster이됩니다.
MySQL의 전체 텍스트 문제는 현재 와일드 카드 검색이 가능하지 않으며 접두사 검색 ('foo *'는'foobar'와 일치하지만'* bar'는 그렇지 않습니다)에서만 가능하다는 것입니다. – Itai
Apache Lucene과 Solr에는 동일한 제한이 있습니다. Sphinx Search는 중위 색인 생성을 지원하므로 패턴의 시작 부분에 와일드 카드를 넣을 수 있습니다. http://sphinxsearch.com/docs/current/conf-min-infix-len.html을 참조하십시오. –
왜 벤치마킹/프로파일로 작성하지 않았습니까? – marto
@matro : 벤치 마크/프로필은 무엇입니까? enthu에 대해서 – Gowri
마찬가지로 빠릅니다. 전체 텍스트 인덱스와 '일치'는 훨씬 빠릅니다. – Johan