2009-11-11 5 views
1

MySQL에서 색인을 사용하여 이러한 행을 정렬하고 싶습니다.범위에서 MySQL ORDER BY 최적화

SELECT 
    identity_ID 
FROM 
    identity 
WHERE 
    identity_modified > 1257140905 
ORDER BY 
    identity_modified 

그러나 이것은 정렬을 위해 파일롯을 사용합니다 (바람직하지 않음).

여기에서 ORDER BY 절을 끝내면 행이이라는 WHERE 절을 만족시키기 위해 색인을 사용하는 결과로 간단히 정렬되어 나온 것입니다 ().

WHERE 절을 남겨두고 원하는 동작을 얻을 수 있지만 MySQL의 동작이 순서에 맞게 일관성있게 유지되고 MySQL이 변경된 경우 나중에 스팅 될 수 있습니다. 그것의 내부 행동.

어떻게해야합니까? 인덱스는 (B-tree) 순서로 저장되기 때문에 파일 포 트가 필요 없다는 것을 MySQL에 알리는 방법은 무엇입니까?

표는이 (간체)과 같습니다

CREATE TABLE IF NOT EXISTS `identity` (
    `identity_ID`  int(11) NOT NULL auto_increment, 
    `identity_modified` int(11) NOT NULL, 
    PRIMARY KEY   (`identity_ID`), 
    KEY     `identity_modified` (`identity_modified`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ; 
+0

여기 내 이해를 명확히하기 위해 identity_modified를 분류하고 다른 필드는 분류하지 않겠습니까? 또는 포인트가 누락되었습니다 – Treby

+0

요점은, 특정 날짜 이후에 수정 된 모든 레코드를 검색하고 마지막으로 수정 한 날짜로 정렬하고자합니다. 나는 MySQL이 이것을 위해서 filesort를해야하는 것을 원하지 않는다; 그것은 테이블의 대부분을 정렬해야 할 수 있습니다. MySQL은 인덱스 행을 순서대로 저장하므로 filesort는 필요하지 않습니다. – thomasrutter

+0

주문에 대한 또는하지 않고이 검색어에 대한 설명을 게시 할 수 있습니까? 나에게 그것은 전체 스캔과 정렬 중 하나이거나 정렬없이 인덱스를 사용하는 것이다 (얼마나 많은 레코드가 페치되어 있는가에 따라). – Pomyk

답변

0

지금까지이 솔루션은 ORDER BY 조항을두고 쿼리에 FORCE INDEX (identity_modified)를 추가하는 것입니다. 이것은 이론적으로 행이 색인에 저장된 순서대로 리턴되도록 보장해야합니다.

아마도 모범 사례 방법 일 것이지만, 내가 원하는 방식으로 작동하는 유일한 방법 인 것 같습니다.

0

당신이 INNODB에 테이블 형식을 변경하면 filesort

ALTER 표 mydb에게이되지 않습니다. identity ENGINE = INNODB; http://forums.mysql.com/read.php?24,10738,10785#msg-10785

전과 수술 후 EXPLAIN과 원래 쿼리를 실행 :

는하지만 쿼리에 문제가 확실하지 않다.

http://dev.mysql.com/doc/refman/5.0/en/using-explain.html

+0

예, 해당 열에 인덱스가 있습니다. WHERE 절에 대한 인덱스를 사용하고 있지만 인덱스를 사용하여 정렬을 수행하지는 않습니다. – thomasrutter

+0

테이블을 다시 만들 수 있도록 스크립트를 만들 수 있습니까? 위의 쿼리가 위의 쿼리입니까 아니면 누락 된 것입니까? – orjan

+0

질문에 표를 추가했습니다. 예, 위의 쿼리는 완전한 것입니다. 수정 된 날짜가 특정 값보다 큰 identity_ID 값만 있으면됩니다. – thomasrutter