2012-07-23 3 views
5

아래 문과 같은 select 문이 있으면 인덱스에 어떤 순서와 열을 포함시켜야합니까?인덱스 열 및 순서

SELECT MIN(BenchmarkID), 
     MIN(BenchmarkDateTime), 
     Currency1, 
     Currency2, 
     BenchmarkType 
FROM Benchmark 
     INNER JOIN MyCurrencyPairs ON Currency1 = Pair1 
          AND Currency2 = Pair2 
WHERE BenchmarkDateTime > IN_BeginningTime 
GROUP BY Currency1, Currency2, BenchmarkType; 

가방 유의할 :

  • 벤치 마크 표
  • IN_BeginningTime은 입력 파라미터이다
  • MyCurrencyPairs 테이블 10 개 미만 레코드를 가질 것이다 로컬 테이블의 행의 수 십억 것
  • 열 통화 및 통화 2는 VARCHAR입니다.
  • 열 BenchmarkID 및 BenchmarkType은 다음과 같습니다. 의 INT
  • 열 BenchmarkDateTime는 날짜 (희망이 분명했다)

내가 Currency1, Currency2, BenchmarkType, BenchmarkDateTime 및 BenchmarkID으로 인덱스를 생성했지만 내가 원하는 한 속도를 점점되지 않았습니다입니다. 더 나은 색인을 만들 수 있습니까?


편집 # 1 : 누군가가 아래의 설명 결과를 요청했습니다. 무엇을

enter image description here


편집 # 2 필요한 경우 알려줘 : 누군가가 DDL을 요청 두 테이블 (나는이 문장을 만들 수있다 있으리라 믿고있어) :

(이 벤치 마크 표

CREATE TABLE `benchmark` (
    `SequenceNumber` INT(11) NOT NULL, 
    `BenchmarkType` TINYINT(3) UNSIGNED NOT NULL, 
    `BenchmarkDateTime` DATETIME NOT NULL, 
    `Identifier` CHAR(6) NOT NULL, 
    `Currency1` CHAR(3) NULL DEFAULT NULL, 
    `Currency2` CHAR(3) NULL DEFAULT NULL, 
    `AvgBMBid` DECIMAL(18,9) NOT NULL, 
    `AvgBMOffer` DECIMAL(18,9) NOT NULL, 
    `AvgBMMid` DECIMAL(18,9) NOT NULL, 
    `MedianBMBid` DECIMAL(18,9) NOT NULL, 
    `MedianBMOffer` DECIMAL(18,9) NOT NULL, 
    `OpenBMBid` DECIMAL(18,9) NOT NULL, 
    `ClosingBMBid` DECIMAL(18,9) NOT NULL, 
    `ClosingBMOffer` DECIMAL(18,9) NOT NULL, 
    `ClosingBMMid` DECIMAL(18,9) NOT NULL, 
    `LowBMBid` DECIMAL(18,9) NOT NULL, 
    `HighBMOffer` DECIMAL(18,9) NOT NULL, 
    `BMRange` DECIMAL(18,9) NOT NULL, 
    `BenchmarkId` INT(11) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`BenchmarkId`), 
    INDEX `NextBenchmarkIndex01` (`Currency1`, `Currency2`, `BenchmarkType`), 
    INDEX `NextBenchmarkIndex02` (`BenchmarkDateTime`, `Currency1`, `Currency2`, `BenchmarkType`, `BenchmarkId`), 
    INDEX `BenchmarkOptimization` (`BenchmarkType`, `BenchmarkDateTime`, `Currency1`, `Currency2`) 
) 

은 (내가) 내 일상의 MyCurrencyPairs 테이블을 만드는거야) 데이터베이스에 존재

CREATE TEMPORARY TABLE MyCurrencyPairs 
    (
     Pair1 VARCHAR(50), 
     Pair2 VARCHAR(50) 
    ) ENGINE=memory; 
    CREATE INDEX IDX_MyCurrencyPairs ON MyCurrencyPairs (Pair1, Pair2); 
+0

EXPLAIN