2014-12-17 5 views
0

filesort를 사용하고 인덱스를 사용하지 않는 매우 간단한 SELECT가 있습니다.MySQL :이 SQL 쿼리가 인덱스를 사용하지 않는 이유는 무엇입니까?

다음 쿼리 고려 :

CREATE TABLE `forum_topic` (
`id` bigint(20) NOT NULL AUTO_INCREMENT, 
`slug` varchar(255) NOT NULL, 
`forum_id` int(10) NOT NULL DEFAULT '1', 
`title` varchar(100) NOT NULL, 
`topic_status` tinyint(1) NOT NULL DEFAULT '0', 
`post_count` bigint(20) NOT NULL DEFAULT '0', 
`modified_date` datetime NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`), 
    KEY `slug` (`slug`), 
    FULLTEXT KEY `title` (`title`), 
    KEY `modified` (`modified_date`, `topic_status`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

는 EXPLAIN (여기 더 간단한 만들기 위해 몇 열을 박탈 )

SELECT * FROM forum_topic 
WHERE topic_status = 0 
ORDER BY modified_date LIMIT 0, 30 

다음 표에를 다음과 같은 출력을 제공

id select_type table?  partitions? type? possible_keys? key? key_len? ref? rows? Extra? 
1 SIMPLE  forum_topic NULL  ALL  NULL   NULL NULL NULL 2075 Using where; Using filesort 

설명문에 possible_keys에 NULL이 있고 모든 행을 스캔 한 후 filesort를 사용하는 방법을 알 수 있습니다.

감사.

+0

'수정 된'색인은 필드를 거꾸로 가질 수 있습니다. 얼마나 많은 행이 있습니까? –

답변

0

이 쿼리는 상수에서 검색하기 때문에 인덱스의 가장 중요한 위치에 표시하려면 topic_status이 필요합니다.

당신은

KEY `modified` (`modified_date`, `topic_status`) 

을 가지고 대신

KEY `mod2` (`topic_status`, `modified_date`) 

할 수 있습니다. 이것은 필터와 쿼리의 일부를 모두 만족시킬 수 있습니다.

Pro 팁 : SELECT *을 피하고 실제로 필요한 열을 열거하십시오.

프로 팁 : Filesort가 반드시 의미하는 바를 의미하지는 않습니다. MySQL은 정렬과 같은 중간 결과 집합을 구성해야 할 때마다 사용됩니다.

+0

글쎄, 고마워. 여전히 "인덱스 조건"을 사용하지만 여전히 모든 행을 사용해야합니다. 또한 몇 개의 LEFT JOIN을 추가 할 때 다른 테이블에서 사용자 이름 및 포럼 이름과 같은 항목을 얻으려면 다시 "인덱스 조건 사용, 임시 사용, filesort 사용"을 사용합니다. 권리? – Adergaard

관련 문제