아래 문과 같은 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 : 누군가가 아래의 설명 결과를 요청했습니다. 무엇을
편집 # 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);
EXPLAIN
설명 주셔서 감사합니다. Currency1 및 2 필드는 이유 때문에 varchar입니까? 즉 텍스트가 포함되어 있습니까? 그렇다면 필드 유형을 INT로 변경할 수 있도록 조회를 변환 할 수있는 방법이 있습니까? 즉 "GBP"=> 1, "USD"=> 2 – FreudianSlip
슬프게도 ...이 시스템은 잠시 여기에 있었고 큰 변화가있었습니다. 나는 원래 건축가가 그 일을 해줬 으면 좋겠어. 왜 VARCHARs에서 모든 것을 일치 시키려고하는지에 대한 생각이 ..... ..... – Miles