2011-09-21 2 views

답변

21

추가 된 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) 
+0

'benchmark'는 어떻게 작동합니까?이 숫자들의 정확성은 무엇입니까? – Pacerier

+0

'BENCHAMRK'는 제공된 표현식을 주어진 횟수만큼 단순히 실행합니다. https://dev.mysql.com/doc/refman/5.5/en/select-benchmarking.html 정확성에 관해서는 실제로 많이 말할 수는 없습니다. 나는 정밀도에 관해서는 꽤 좋았다고 느꼈다. – Mchl

4

나는 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) 
+0

좋은 캐치! 나는 그것을 테스트하는 것에 대해 생각하지 않았다! – Mchl

5

+1 @ 질문에 가장 직접적으로 대답하는 @Mchl.

그러나 솔루션 중 어느 것도 인덱스를 사용할 수 없으므로 테이블 스캔을 수행해야합니다.

타이타닉의 선체를 패치하려고 할 때 헝겊이나 플라스틱 접착 붕대를 결정하려고하면 바보입니다.

이러한 유형의 쿼리에는 full-text search index이 필요합니다. 표의 크기에 따라 hundreds or thousands of times faster이됩니다.

+2

MySQL의 전체 텍스트 문제는 현재 와일드 카드 검색이 가능하지 않으며 접두사 검색 ('foo *'는'foobar'와 일치하지만'* bar'는 그렇지 않습니다)에서만 가능하다는 것입니다. – Itai

+1

Apache Lucene과 Solr에는 동일한 제한이 있습니다. Sphinx Search는 중위 색인 생성을 지원하므로 패턴의 시작 부분에 와일드 카드를 넣을 수 있습니다. http://sphinxsearch.com/docs/current/conf-min-infix-len.html을 참조하십시오. –

관련 문제