2012-08-07 4 views
0

나는이 쿼리를 실행하는 데 오랜 시간이 걸리는 다른 사람이 구성했으며,이를 최적화 할 방법이 있는지 궁금해합니다.
이 mysql 쿼리 (union 포함)를 최적화 할 수 있습니까?

SELECT COUNT(t2.ticker)/'99' AS PctNewHigh_Yearlyarray 
FROM (
    SELECT t1.ticker, ROUND(SUM(t1.close) , 2) as DailyChange 
    FROM (
     SELECT b.ticker, b.close 
     FROM broad b 
     WHERE b.Date1 = '2012-07-30 00:00:00' 

     UNION 

     SELECT b.ticker, MAX(b.close) * -1 
     FROM broad b 
     WHERE b.Date1 > '2011-07-31 00:00:00' 
     GROUP BY b.Ticker 
     ORDER BY ticker 
    ) t1 
    GROUP BY t1.ticker 
) t2 
WHERE DailyChange = 0 

데이터베이스 구조는 다음과 같습니다

CREATE TABLE `broad` (
    `idbroad` int(11) NOT NULL AUTO_INCREMENT, 
    `Date1` datetime DEFAULT NULL, 
    `Date2` varchar(10) DEFAULT NULL, 
    `Ticker` varchar(45) DEFAULT NULL, 
    `Open` double DEFAULT NULL, 
    `High` double DEFAULT NULL, 
    `Low` double DEFAULT NULL, 
    `Close` double DEFAULT NULL, 
    `Vol` double DEFAULT NULL, 
    `TC2k_IG` varchar(100) DEFAULT NULL, 
    `MS2` varchar(45) DEFAULT NULL, 
    PRIMARY KEY (`idbroad`), 
    KEY `indx_Date1` (`Date1`), 
    KEY `indx_Ticker` (`Ticker`), 
    KEY `indx_High` (`High`), 
    KEY `indx_Close` (`Close`), 
    KEY `indx_TC2k_IG` (`TC2k_IG`), 
    KEY `indx_Vol` (`Vol`), 
    KEY `indx_Open` (`Open`), 
    KEY `indx_Low` (`Low`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

난 당신이 도움이 더 많은 데이터가 필요한 경우 알려 주시기 수 있기를 바랍니다.
모든 데이터는 예를

INSERT INTO `broad` (`idbroad`, `Date1`, `Date2`, `Ticker`, `Open`, `High`, `Low`, `Close`, `Vol`, `TC2k_IG`, `MS2`) VALUES 
(726, '2002-10-10 00:00:00', '20021010', 'A', 10.95, 11.13, 10.8, 10.85, 48534, 'EXAMPLE NAME', ''); 
+0

검색어가 반환해야하는 내용에 대해 간략하게 설명해 주시겠습니까? – Grampa

+0

각 시세 표시기에는 하루에 '닫기'가 하나뿐입니까? – Jodaka

+0

예 @jodaka, 나는 하나의 결과로 질문을 갱신 할 것이다. – chifliiiii

답변

0

이 같은 결과를 생성하지만, 더 빠르게 처리 될 수에 대한 주식 시장 데이터입니다.

SELECT COUNT(t2.ticker)/'99' AS PctNewHigh_Yearlyarray 
FROM (
    SELECT t1.ticker, ROUND(SUM(t1.close) , 2) as DailyChange 
    FROM (
     SELECT b.ticker, 
     MIN(CASE WHEN b.Date1 > '2011-07-31 00:00:00' THEN b.close * -1 ELSE b.close END) AS close 
     FROM broad b 
     WHERE b.Date1 >= '2011-07-31 00:00:00' 
     GROUP BY b.Ticker 
     ORDER BY NULL 
    ) t1 
    GROUP BY t1.ticker 
) t2 
WHERE DailyChange = 0 

당신은에서 EXPLAIN SELECT ...을하고있는 인덱스를 사용하는 경우 (아마도 모두, 당신과 내) 쿼리는 확실히 알에 게시합니다. 많은 인덱스를 조합하지 않고 인덱스를 결합하는 것이 좋습니다.