2011-01-18 5 views
0

내 쿼리 중 하나가 느린 이유가 궁금합니다. 인덱스가 있고 방금 새 쿼리를 만들었습니다.MySQL이 왜 쿼리가 느린 지 혼란 스럽습니다. 인덱스가 있습니까?

그래도 여전히 느리고 느린 로그에 나타납니다.

SELECT *, 
     COUNT(Word) AS WordCount 
    FROM `keywords` 
    WHERE `LetterIdx` = 'A' 
GROUP BY Word 
ORDER BY Word; 

Heres는 내 쿼리

은 ... Heres는 쿼리가

alt text Heres는 내 테이블 구조와 인덱스를 EXPLAIN'd.

alt text

답변

2

당신은 당신이 더 도움이 될 수 있습니다 (LetterIdx, 워드)에 걸쳐 종합 지수를 작성하는 경우는, 빨리이처럼 많이 실행 찾을 수 있습니다. 이것은 나의 추측이 말씀의 LetterIdx = 첫 글자는,이 "

# First create index on Word, then 
SELECT Word, 
    COUNT(Word) AS WordCount 
FROM `keywords` 
WHERE `Word` like 'A%' 
GROUP BY Word 
ORDER BY Word; 

에 관해서는 더 나은 작동 할 수 있음을 맞으면 대신이 단일 열 인덱스

CREATE INDEX keywords_l_w on keywords(letterIdx, Word) 

SELECT Word, 
    COUNT(Word) AS WordCount 
FROM `keywords` 
WHERE `LetterIdx` = 'A' 
GROUP BY Word 
ORDER BY Word; 

의 2 열 인덱스입니다 왜 내 쿼리 중 하나가 느린 지, 인덱스가 있고 방금 새 쿼리를 만들었습니다. "

레코드의 모든 열을 검색하도록 요청했기 때문입니다. 정말 필요한가요? 인덱스 (모든 데이터의 ~ 1/26)를 사용할 수 있다고해도 다른 모든 열을 검색하기 위해서는 데이터 페이지를 조회해야합니다. 표지 인덱스 (letteridx, word)가 있으면 데이터로 돌아갈 필요가 없습니다.

* 및 GROUP BY는 엄격한 SQL 관점에서 좋은 조합이 아닙니다. 리처드 말했듯이

+0

유일한 문제는 LetterIdx에서 AI에 숫자도 포함된다는 것입니다. 그래서 A %는 이것을 포함하지 않을 것입니다. 첫 번째 쿼리는 속도에 아무런 영향을 미치지 않았습니다. 더 이상의 아이디어? – Jules

+0

(letteridx, word)에 색인을 생성 했습니까? 그것에 대해서도 설명 할 기회가 있습니까? – RichardTheKiwi

+0

인덱스는 2 개의 단일 열 인덱스가 아니라 2 개의 열에 걸쳐 있습니다. 답변이 업데이트되었습니다. FYI, 순서는 중요합니다 (Word, LI)! = (LI, Word) – RichardTheKiwi

0

+0

위와 같이 word와 letteridx에 대한 색인이 이미 있습니다. – Jules

+0

같은 cyberkiwi 언급 한 인덱스의 열의 순서., 인덱스가 실제로 저장되는 방법을 지시합니다 수있는 방법을 지시하고 효율적으로 사용할 수 없습니다. – goat

0

에 의해/ORDER BY에 복합 인덱스 (LetterIdx, 워드)

그런 다음 where 절 그 speciofc 모두 인덱스를 사용할 수 있어야하고, 그 특정 그룹을보십시오 LetterIdx와 Word에서 복합 색인을 사용해야합니다.

하지만 난 당신이 쿼리 할 있습니다 sugest :

는, GROUP BY가 열을 주문
SELECT Word, COUNT(*) AS WordCount 
FROM `keywords` 
WHERE `LetterIdx` = 'A' 
GROUP BY Word 

때문에,이 작업을 수행 할 수 있습니다 : GROUP BY Word DESC 당신이 ORDER BY를 사용할 필요가 없습니다를 ...

관련 문제