복붙노트

[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. ==============================

    1.인덱스는 끝으로 문자열의 처음부터 내장되어 있습니다. 당신이 좋아하는 '무엇이든 %'유형 절을 사용하면, MySQL은 매우 빠르게 무엇을 찾기 위해 그 시작 기반 인덱스를 사용할 수 있습니다.

    인덱스는 끝으로 문자열의 처음부터 내장되어 있습니다. 당신이 좋아하는 '무엇이든 %'유형 절을 사용하면, MySQL은 매우 빠르게 무엇을 찾기 위해 그 시작 기반 인덱스를 사용할 수 있습니다.

    그러나 LIKE로 전환 '% 것은 무엇이든 %'문자열의 시작이 앵커를 제거합니다. 검색어가 더 이상 문자열의 시작에 고정되어 있기 때문에 이제 시작 기반 인덱스를 사용할 수 없습니다 - 그것은 "부동"있어 중간에 어딘가 전체 필드 검색 수 없습니다. 모든 LIKE '% ... 쿼리 인덱스를 사용하지 않을 수 있습니다.

    당신이하고있는 모두가 '부동'을 검색하면 그들이 사용의 유형을 위해 설계하고 있기 때문에 당신이 전체 텍스트 인덱스를 사용하는 이유입니다.

    주요 참고로 : InnoDB는 현재 버전 5.6.4 기준으로 전체 텍스트 인덱스를 지원합니다. 그래서 당신은 적어도 5.6.4로 업그레이드 할 수 없다면, 이노 * 및 전체 텍스트 검색을 사용하는 당신을 다시 구금 아무것도 없다.

  2. ==============================

    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는 모든 행을 검색 할 수 있습니다 만, 여전히 인덱스를 활용할 수있다?

  3. from https://stackoverflow.com/questions/10354248/optimizing-mysql-like-string-queries-in-innodb by cc-by-sa and MIT license