2013-12-12 6 views
3

나는 like 조건을 사용하는 쿼리를 가지고 있고 이 BTW 내 표는 약 120K 행이 (이 쿼리 내가 느린 쿼리 로그에 자주 무엇을 얻을) 내 서버 를 죽이고 - 행복은 구문 오류를 ignorFULLTEXT 인덱스 추가 : 이전 데이터를 인덱싱 할 예정입니까?

select * from `images` where `category` like `%,3,%` and (`tags` like '%,tag1,%' or `tags` like '%,tag2,%' or `tags` like '%,tag3,%' or `tags` like '%,tag4,%') 

나는 이제 myisam으로 전환하고 tags 열에 대한 전체 텍스트 색인을 사용하기로 결정했습니다.

서버 부하가 그다지 변하지 않았기 때문에 mysql은 여전히 ​​90 %의 CPU (저주의 8 개 중 1 개)를 사용하고 있습니다.

그래서이 전체 텍스트 색인 생성 ...이 색인을 추가하기 전에 이전 데이터를 색인 할 것입니까? 사촌은 매우 빨리 일어나고 내 테이블은 좀 크다.

또는 새로 저장된 데이터에서만 작동합니까?

답변

2

기존 데이터가 인덱싱되었지만 Pyrce가 권고 한대로 LIKE %[token]% 쿼리는 전체 텍스트 인덱스를 활용할 수 없습니다.

은 ( stopwords and the likes을 무시하고) 당신의 inital 질문이 엄격하게 동등한, 같은 당신의 상태를 다시 작성

:

WHERE MATCH(tags) AGAINST ('tag1 tag2 tag3 tag4' IN BOOLEAN MODE) 

당신이 아니라 당신의 구조를 정상화에 집중해야하지만. 필드에 비 스칼라 값 (예 : 쉼표로 구분 된 값)을 저장하면 first normal form에 위배됩니다.

image_tag 테이블을 만들고 images과 1-N 관계를 설정하십시오. 일반 색인을 사용하면 즉석 질의가 가능합니다.

CREATE TABLE image_tags (
    image_id INT, 
    tag VARCHAR(50), 
    PRIMARY KEY (image_id, tag), 
    FOREIGN KEY (image_id) REFERENCES images(id), -- replace with "images" table's actual primary key 
    KEY(tag, image_id) -- this index may be superfluous, check EXPLAIN 
); 

SELECT images.* 
FROM images 
JOIN image_tags ON image_id = images.id 
WHERE tag IN ('tag1', 'tag2', 'tag3', 'tag4'); 

images.category으로 반복하십시오.

2

전체 텍스트 인덱싱은 일반적으로 토큰의 접두사 일치에만 도움이됩니다. 즉, tags 열의 영숫자와 밑줄로 분리 된 모든 단어 (A-Z, 0-9 또는 _ 이외의 단어는 모두 here 참조)는 접두사 일치에 대해 색인이 생성됩니다. 전체 텍스트 색인 검색과 일치 시키려면 MATCH (tags) AGAINST ('tag1')을 사용해야합니다. 전체 태그를 찾으려면 각 태그에 대해 이러한 일치 항목을 반복 할 수 있습니다. Explain 쿼리를 수행하면 쿼리 작성기가 완전히 구성된 쿼리 작성기가 인덱스를 사용하는지 여부를 알 수 있습니다.

불행히도 MySQL은 전체 텍스트 인덱싱/검색을 변경하는 방법이 다소 제한적이므로 대부분 기본 검색 방법이 있습니다 (풀 텍스트에 대한 몇 가지 검색 모드 - docs 참조).

+0

미안 해요, 난'태그'으로 구분된다 .. 쿼리를 업데이트했습니다 ... 그래서 당신은 내가 어디에 태그 '%, tag1로처럼> = 함께 가야 전체 텍스트 작업을 위해 말 , '? – max

+0

분명히 문제를 조사한 후에 MySQL은이 영역에서 Postgres보다 훨씬 능력이 떨어집니다 ... http://makandracards.com/makandra/13693-customize-tokenization-of-the-mysql-fulltext-parser를 참조하십시오.', '구분 기호를 사용하지 않거나 MySQL에 C 플러그인을 작성하지 않도록 행을 변경해야합니다 (제안되지 않음). 내 대답을 업데이트 할게. – Pyrce

1

Sphinx Fulltext 검색으로 시도해보십시오. 그것은 오픈 소스 검색 서버입니다. 희망이 당신을 위해 도움이됩니다.

http://sphinxsearch.com/