programing

INSTR과 LIKE 중 어느 것이 더 빠릅니까?

goodsources 2023. 8. 9. 20:42
반응형

INSTR과 LIKE 중 어느 것이 더 빠릅니까?

MySQL 열('varchar', 'text', 'blob' 등)에 문자열이 있는지 테스트하는 것이 목표라면 다음 중 더 빠르고 효율적이며 사용하기 좋은 것은 무엇입니까?

아니면, 이것들 중 하나를 능가하는 다른 방법이 있습니까?

INSTR( columnname, 'mystring' ) > 0

columnname LIKE '%mystring%'

키비부가 위의 논평에서 언급했듯이, 전체 텍스트 검색은 확실히 더 빨라질 것입니다.

그러나:

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 vs LOCATE vs LIKE vs REGEXP

ISTR과 LOCATION이 가장 빠르게 수행되었습니다.

# 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;

여기에 있는 것처럼 보이는 "프론트 윌카드"(즉, "%..." 서술어)의 경우, INSTR과 LIKE는 대략 동일하게 수행해야 합니다.

와일드카드가 "전면 와일드카드"가 아닌 경우, 와일드카드가 매우 선택적이지 않은 경우를 제외하고 LIKE 접근 방식이 더 빨라야 합니다.

와일드카드의 유형과 선택성 문제가 발생하는 이유는 INSTR()을 가진 술어가 체계적으로 테이블 스캔을 수행하기 때문입니다(SQL은 INSTR의 의미에 대해 어떠한 가정도 할 수 없습니다).SQL이 LIKE 서술어의 의미에 대한 이해를 활용하여 인덱스를 사용하여 가능한 일치 항목 집합만 테스트할 수 있습니다.

질문 자체 아래에 있는 코멘트에서 제안된 것처럼 전체 텍스트 색인은 훨씬 더 빠를 입니다.이 차이는 텍스트 내 단어의 특정 분포와 전체 표 크기 등에 따라 다르지만 두 배에서 열 배까지 빠른 속도를 기대할 수 있습니다.

이러한 인덱스를 만들기 위한 일반적인 오버헤드 외에 전체 텍스트 인덱스에서 사용할 경우 발생할 수 있는 단점은 이 인덱스를 구성할 때 매우 신중하지 않은 경우(예: 중지 단어 목록 정의, 굴절형 등을 피하기 위한 특정 검색 구문 사용),FullText에서 제공하는 결과가 예상과 다를있습니다.예를 들어, "SAW"(목재를 자르기 위한 도구)를 검색하면 다양한 활용형으로 동사 "to see"를 포함한 레코드에 대한 많은 히트를 얻을 수 있습니다.
물론 전체 텍스트 색인의 이러한 언어 인식 기능은 일반적으로 재정의될 수 있으며 이러한 기능이 단점이 아닌 효과적인 이점이라고 생각할 수도 있습니다.이것을 일반 와일드카드 검색과 비교하고 있기 때문에 여기서 언급합니다.

래즈드의 테스트에는 추가할 것이 거의 없습니다.하지만 Seth가 그의 논평에서 지적한 과 달리, 사용하는 것은 훨씬많은 처리 부하를 초래합니다.

에서는 다테스에설것가으정니다합로는정을 설정하는 합니다.query_cachingOn집에서ini 서에서

query_cache_type = 1
query_cache_size = 64M

테스트

  • 타이밍은 세 가지 측정 중 평균 성능을 나타냅니다(캐시가 간헐적으로 지워짐).

  • 맘에 들다

    SELECT * FROM `domain_model_offers` WHERE `description` LIKE '%inform%' LIMIT 0 , 30
    

    초기: 0.0035s
    캐시: 0.0005초

  • REGEXP

    SELECT * FROM `domain_model_offers` WHERE `description` REGEXP 'inform' LIMIT 0 , 30
    

    이니셜: 0.01초
    캐시: 0.0004초

결과

LIKE또는INSTR 다보확빠실히릅다니다빠니릅▁defin▁is▁than.REGEXP.

캐시 타이밍 차이는 미미하지만, 추가 조사를 하기에 충분할 것입니다.

구성된 MySQL 시스템에서 전체 텍스트 인덱싱은 일반적으로 항상 빠르거나 적어도 인덱싱되지 않은 검색과 동등해야 합니다.따라서 색인화, 특히 간헐적인 마크업 코드에 관계없이 긴 인간 언어 텍스트에 사용합니다.

언급URL : https://stackoverflow.com/questions/2451608/which-is-faster-instr-or-like

반응형