2012-07-12 4 views
1

단어 목록에서 하위 문자열 데이터베이스를 생성했습니다. 나는 일부 입력 단어가있는 하위 문자열을 공유하는 모든 단어를 검색하기 위해 비교를 수행하고 있습니다.MySQL 자체 조인 쿼리 최적화

'word_substrings'데이터베이스 형식과 예 (단어 '당황'에 대한) 다음 'word_id이'단어의 테이블에있는 단어의 핵심이다

id (primary key), word_id (Foreign Key), word_substring (char(3)) 

    30    4      " a" 
    31    4      " ab" 
    32    4      "aba" 
    33    4      "bac" 
    34    4      "ack" 
    35    4      "ck " 
    36    4      "k " 

.

나는 동등성을 시도했다 :

select distinct t1.word_id 
     from word_substrings t1, word_substrings t2 
     where t1.word_substring = t2.word_substring 
     and t2.word_id = [some word_id] 

뿐만 아니라 테이블

가입 :

select distinct t1.word_id 
     from word_substrings as t1 
     join word_substrings as t2 
     on t1.word_substring = t2.word_substring 
     where and t2.word_id = [some word_id] 

그러나 두 쿼리 결과를 반환하도록 약 10 초 정도 걸립니다.

word_substrings 테이블과 word_substrings 테이블이 모두 변경 될 수는 있지만 데이터는 매우 정기적으로 검색되므로 쿼리 시간을 개선하는 데 도움이되는보기를 만들었습니다. 그러나 나는 돌아 오는 시간에 명목상의 변화가 없음을 알았다.

내 단어 목록은 현재 40k 행이고 하위 문자열 목록은 약 400k 행입니다.

쿼리를 최적화하거나 반환 시간을 개선하기 위해 데이터베이스를 다시 포맷하는 방법에 대한 아이디어가있는 사람이 있습니까?

가능한 모든 하위 문자열을 나타내는 열이 있고 해당 열에 각 단어를 등록하는 테이블을 생성하는 것을 고려해 보았습니다. 그러나 어떻게 작동하는지 잘 모릅니다.

귀하의 모든 도움에 감사드립니다. 포함시키지 않은 정보가있는 경우 해당 데이터를 검색해 드리겠습니다.

참고 : 관련 정보는 장고 웹 응용 프로그램을위한 것입니다.

+0

테이블에 'word_substring'및 'word_id' 열에 대한 색인이 있습니까? 'word_substring' 컬럼에 대한 데이터 정렬이란 무엇입니까? – danihp

답변

0

word_idword_substring에 대한 색인이 필요합니다. 단지 word_id이 작동 쿼리를 사용하여, 다른 사람들도 작동 word_idword_substring를 사용하여,

이 방법 (당신이 할 수있는 경우뿐만 아니라, not null로 열을 설정).

건배.

+0

내 의견으로는 그는 (word_substring), (word_id), (word_substring, word_id), (word_id, word_substring) – danihp

+0

불행히도 mysql은 같은 테이블의 다양한 인덱스를 잘 관리하지 못한다는 것을 내 의견으로는 ... – Sebas

+1

어디에서 할 수 있습니까? 당신의 문장에 대해 더 많이 알기를 원합니까? – danihp