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_caching
On
집에서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
'programing' 카테고리의 다른 글
SQL Server에서 100만 행 삭제 (0) | 2023.08.09 |
---|---|
Angular2의 (키업) 옵션은 무엇입니까? (0) | 2023.08.09 |
날짜별 행 크기 찾기 (0) | 2023.08.09 |
도커가 시스템 시작 시 컨테이너를 자동으로 시작하지 않도록 방지하는 방법은 무엇입니까? (0) | 2023.08.09 |
마이크로미터를 사용하여 스프링 부트에 사용할 메트릭의 화이트리스트를 지정하는 방법 (0) | 2023.08.09 |