[SQL] 이노 디비에서 MySQL을 LIKE '% 문자열 %'쿼리를 최적화
SQL이노 디비에서 MySQL을 LIKE '% 문자열 %'쿼리를 최적화
이 테이블을 갖는 :
CREATE TABLE `example` (
`id` int(11) unsigned NOT NULL auto_increment,
`keywords` varchar(200) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
우리는 다음과 같은 쿼리를 최적화하고 싶습니다 :
SELECT id FROM example WHERE keywords LIKE '%whatever%'
테이블은 이노, 같은 쿼리를 최적화하기 위해 최선의 인덱스 순서대로 사용하는 것 (지금은 FULLTEXT 때문에)입니까?
우리는 간단한을 시도했다 :
ALTER TABLE `example` ADD INDEX `idxSearch` (`keywords`);
하지만이 필요 전체 테이블을 스캔 할 것을 쿼리 쇼를 설명 경우 LIKE '는 어떤 %'대신에,이 지수가 수행 잘하지만, 그 값이없는 우리의 쿼리.
이노 디비에 대해이 작업을 최적화 할 수 어쨌든 있나요?
감사!
해결법
-
==============================
1.인덱스는 끝으로 문자열의 처음부터 내장되어 있습니다. 당신이 좋아하는 '무엇이든 %'유형 절을 사용하면, MySQL은 매우 빠르게 무엇을 찾기 위해 그 시작 기반 인덱스를 사용할 수 있습니다.
인덱스는 끝으로 문자열의 처음부터 내장되어 있습니다. 당신이 좋아하는 '무엇이든 %'유형 절을 사용하면, MySQL은 매우 빠르게 무엇을 찾기 위해 그 시작 기반 인덱스를 사용할 수 있습니다.
그러나 LIKE로 전환 '% 것은 무엇이든 %'문자열의 시작이 앵커를 제거합니다. 검색어가 더 이상 문자열의 시작에 고정되어 있기 때문에 이제 시작 기반 인덱스를 사용할 수 없습니다 - 그것은 "부동"있어 중간에 어딘가 전체 필드 검색 수 없습니다. 모든 LIKE '% ... 쿼리 인덱스를 사용하지 않을 수 있습니다.
당신이하고있는 모두가 '부동'을 검색하면 그들이 사용의 유형을 위해 설계하고 있기 때문에 당신이 전체 텍스트 인덱스를 사용하는 이유입니다.
주요 참고로 : InnoDB는 현재 버전 5.6.4 기준으로 전체 텍스트 인덱스를 지원합니다. 그래서 당신은 적어도 5.6.4로 업그레이드 할 수 없다면, 이노 * 및 전체 텍스트 검색을 사용하는 당신을 다시 구금 아무것도 없다.
-
==============================
2.또한 '% ABC %'쿼리와 같은 내 경우 쿼리 속도를 도움이 인덱스를 생성, 그 놀라 울 댓글을 남기고있다.
또한 '% ABC %'쿼리와 같은 내 경우 쿼리 속도를 도움이 인덱스를 생성, 그 놀라 울 댓글을 남기고있다.
우분투에서 MySQL 5.5.50 실행 (기본에 모든 것을 떠나), I는 열이 많은 테이블을 만들어 10 만 개 더미 항목을 삽입했습니다. 하나의 열에서 I는 32 개 문자로 완전히 랜덤 문자열을 삽입 (즉, 그들은 모두 고유). 나는 일부 쿼리를 실행하고이 컬럼에 인덱스를 추가했다. 간단한
select id, searchcolumn from table_x where searchcolumn like '%ABC%'
이초 인덱스가없는 인덱스 0.05 초 반환 ~의 결과입니다.
이것은 위의 (그리고 많은 다른 게시물에서) 설명을 맞지 않습니다. 그 이유 무엇을 할 수 있을까?
편집하다 나는 EXPLAIN 출력을 확인했다. 출력은 행이 10 만이지만, 추가 정보는 "; 인덱스를 사용하는 경우 사용"을 말합니다. 그래서 어떻게 든 DBMS는 모든 행을 검색 할 수 있습니다 만, 여전히 인덱스를 활용할 수있다?
from https://stackoverflow.com/questions/10354248/optimizing-mysql-like-string-queries-in-innodb by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 다른 열 그룹화 다른 칼럼의 최대 값에 기초 얻기 [중복] (0) | 2020.07.01 |
---|---|
[SQL] 어떻게 SQL Server의 공휴일을 결정합니까? (0) | 2020.07.01 |
[SQL] 외래 키는 기본 키의 역할을 할 수 있습니까? (0) | 2020.07.01 |
[SQL] MySQL은 - VARCHAR 컬럼에서 숫자 값만 선택 (0) | 2020.07.01 |
[SQL] MySQL의에서 주소 IP 클라이언트를 검색 (0) | 2020.07.01 |