문제

참조:

CREATE TABLE words ( word_id int(11) NOT NULL, word varchar(25) NOT NULL, PRIMARY KEY (word) )

CREATE TABLE synonyms ( source_index int(10) unsigned NOT NULL, destination_index int(10) unsigned NOT NULL )

쿼리 중:

SELECT w.word, z.word FROM words w INNER JOIN synonyms y ON w.word_id=y.source_index INNER JOIN words z ON z.word_id=y.destination_index WHERE w.word='kind'

문제는 항목이 120,000개 미만인 테이블에 대한 쿼리에 400초 이상이 걸린다는 것입니다.나는 이것이 동의어에 대한 유사한 단어 목록이 있는 두 번째 테이블을 갖는 것보다 더 효율적이기를 바랐지만 지금까지는 그렇지 않다는 것이 입증되었습니다.나는 동의어를 단어의 중복이 아니기 때문에 별도의 단어 테이블로 유지하는 데 아무런 불만이 없습니다.온라인에서 더 낮은 시간 동안 이러한 쿼리를 조정하는 데 적용 가능한 항목을 찾지 못했습니다.이것을 합리적인 속도(<100msec)로 조정할 수 있는 방법이 있습니까? 아니면 '분할 자체 참조' 없이 더 나을 수 있습니까?

도움이 되었습니까?

해결책

지금은 하나의 인덱스만 추가했습니다. words ~을 위한 word.따라서 귀하의 쿼리는 지금 적어도 하나의 결과를 가져올 것입니다. 전체 테이블 스캔 모두 words 그리고 synonyms, 아마도 그 이상일 수 있습니다. 이는 DBMS 및 쿼리 최적화 프로그램의 기능에 따라 달라질 수 있습니다.

추가해 보세요 색인 ~에 words ~을 위한 word_id 그리고 계속 synonyms 적어도 source_index.이렇게 하면 쿼리가 인덱스를 사용하고 전체 테이블 스캔을 수행하지 않습니다.

아마도 다음을 사용하여 이를 개선할 수 있습니다. 커버링 인덱스, 예를 들어 (word_id, word) ~에 words 그리고 (source_index, destination_index) ~에 synonyms.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 dba.stackexchange
scroll top