문제
참조:
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
.