2011-10-27 4 views
1

예를 들어 지난 달 제출 한 기사 중 가장 많이 본 기사를 얻으려면 다음 쿼리를 사용합니다.쿼리로 MySQL 순서 최적화하기

explain 
SELECT * 
FROM article 
WHERE date > 1315391769 
ORDER BY views DESC 
LIMIT 10 

어떻게이 쿼리에 적합한 인덱스를 선택합니까? 또는 많은 행이나 파일 정렬을 스캔하지 않으려면 어떻게 다시 써야합니까?

CREATE TABLE `article` (
    `id` int(11) NOT NULL auto_increment, 
    `title` varchar(50) NOT NULL, 
    `body` text NOT NULL, 
    `date` int(32) NOT NULL, 
    `views` int(11) NOT NULL default '0', 
    PRIMARY KEY (`id`), 
    KEY `date` (`date`), 
    KEY `views` (`views`), 
    KEY `date_2` (`date`,`views`), 
    KEY `views_2` (`views`,`date`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=200003 ; 

-- 
-- Dumping data for table `article` 
-- 

INSERT INTO `article` VALUES (1, 'title test113', 'test body118', 1317912183, 5017); 
INSERT INTO `article` VALUES (2, 'title test193', 'test body193', 1313441124, 5943); 
INSERT INTO `article` VALUES (3, 'title test112', 'test body116', 1312773586, 653); 
INSERT INTO `article` VALUES (4, 'title test378', 'test body374', 1316786646, 4589); 
INSERT INTO `article` VALUES (5, 'title test335', 'test body3310', 1319173694, 6224); 

주의 사항 :

내가 노력 현재 인덱스 테이블 방식이다 나는 대신 유닉스 타임 스탬프의 MySQL의 날짜를 시도했지만 나는 같은 결과를 얻었다.

은 EXPLAIN의 출력 :

id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 SIMPLE article  range date,date_2  date 4 NULL 107245 Using where; Using filesort 
+0

내가 샘플로 5 행을 게시 @. –

+0

int (32)는 무엇입니까? 좀 더 큰 int에 서명 했나요? 그 문제에 관해서, int (11)는 무엇입니까 ?? http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html –

+0

이것은 11이 아니야 32입니다. 이미 MySQL 시간 및 MySQL datetime으로 변경했으며 동일한 결과를 얻었습니다. –

답변

1

하나의 키 date_2 (date, views) 문제의 쿼리에 대한 최적의 성능을 제공한다. here 다른 인덱스가 도움이 될 것이라고 생각하지 않습니다. 쿼리가 너무 단순하기 때문에 다른 최적화를 생각할 수 없습니다!

+0

아니요, user_ksa가 정확합니다. '(날짜)'또는'(보기)'인덱스를 사용할 수 있습니다. –

1

이러한 종류의 쿼리의 경우 (date) 또는 (views) 색인 만 사용할 수 있으며 (date,views)은 사용할 수 없습니다. MySQL이 사용하기로 결정한 것이 최적 일 수도 있고 아닐 수도 있습니다. 2 월에 최적 인 것은 4 월 데이터가 아닐 수도 있습니다!

  • 두 가지 중 하나를 시도하고 우월함을 측정 할 수 있습니다.

  • 당신 2011 년 4 월에 대한 CHAR(6)201104 등을 이용하여, Year-Month 데이터로 계산 된 열을 추가 할 수 있습니다 (즉, 열이 INSERT와 UPDATE를 트리거 사용하여 업데이트 할 수 있습니다) 또는 int24136 같은 (24,136 = 2011 * 12 + 4).

그런 다음 조건은 다음과 같습니다

WHERE YearMonth = '201109'   --- for September 

또는

WHERE YearMonth = 2011*12+9  

(YearMonth, views) 인덱스가 사용될 수 있습니다.

1

강제로 색인을 작성하면됩니다.

explain 
SELECT * 
FROM article force index (`views`) 
WHERE date>=1315391768 
ORDER BY views DESC 
LIMIT 10 

계획을 설명해

"id" "select_type" "table"  "type"  "possible_keys" "key" "key_len"  "ref" "rows" "Extra" 
"1" "SIMPLE"  "article" "index"   \N   "views" "4"   \N "5" "Using where"