2016-09-20 2 views
0

내 생각에 너무 오래 걸리는 SQL 쿼리가 있습니다. 약 30 초가 걸립니다. 두 테이블, RecordMainrecord이 있습니다. 나는 열의 양이 0 인 모든 Mainrecords에 대한 정보를 얻고 싶습니다. 또한이 경우에는 다른 ID가 0 인 ID가있는 최신 레코드를 가져 와서 자신의 금액을 0으로하고 싶습니다. 약 30,000 개의 메인 레코드와 약 3,000,000 개의 레코드가 있습니다. 나는 이것이 어떤 식 으로든 최적화 될 수 있다고 생각하지만 나는 그것을 파악할 수 없다. 테이블 사이의 내부 조인, 많은 시간이 걸림

SELECT * 
FROM (
    mainrecord 
    INNER JOIN (
     SELECT tt.* 
     FROM record tt 
     INNER JOIN (
      SELECT Max(record.timestamp) AS maxtimestamp, id 
      FROM record 
      WHERE record.amount <> 0 
      GROUP BY record.id 
     ) AS rec 
     ON tt.id = rec.id AND tt.timestamp = rec.maxtimestamp 
    ) AS t 
    ON mainrecord.id = t.id 
) 
WHERE amount = 0 

는 EXPLAIN :이 약

+----+-------------+------------+-------------+---------------+-----------+---------+---------------------+---------+----------+---------------------------------------+ 
| id | select_type | table | type  | possible_keys | key | key_len |   ref   | rows | filtered |     Extra     | 
+----+-------------+------------+-------------+---------------+-----------+---------+---------------------+---------+----------+---------------------------------------+ 
| 1 | PRIMARY  | Mainrecord | index_merge | Id,Amount  | Amount |  768 | \N     | 2850 | 100,00 | Using sort_union(Amount); Using where | 
| 1 | PRIMARY  | <derived3> | ref   | key0   | key0  |  768 | db.Mainrecord.Id |  53 | 100,00 | Using where       | 
| 1 | PRIMARY  | tt   | ref   | Id,timestamp | timestamp |  9 | record.maxtimestamp |  1 | 100,00 | Using where       | 
| 3 | DERIVED  | Record  | index  | Amount  | Id  |  768 | \N     | 3185669 | 50,03 | Using where       | 
+----+-------------+------------+-------------+---------------+-----------+---------+---------------------+---------+----------+---------------------------------------+ 
+1

당신에게 어떤 지표를 수행 업데이트] 하위 쿼리

에서 그룹을 추출하기 위해? 또한 'Explain'결과를 질문에 추가하십시오. – Shaharyar

+0

메인 레코드 테이블은 누구입니까? –

+0

@Shaharyar, id 및 amout은 모두 두 테이블의 키입니다. – Nick3

답변

0

무엇을?

SELECT * 
FROM mainrecord mr 
    INNER JOIN (SELECT Max(record.timestamp) AS maxtimestamp, id 
     FROM record 
     WHERE record.amount <> 0 
     GROUP BY record.id) AS max_r ON max_r.id=mr.id 
    INNER JOIN record r ON mr.id = r.id 
WHERE mr.amount = 0 
    AND r.timestamp = max_r.maxtimestamp 
+0

고마워요,하지만이 일을하지는 않습니다. 나는'FROM Record'가'FROM record tt'라고 생각합니다. 괄호의 크기가 일치하지 않기 때문에''rec.maxtimestamp' 다음에'''를 제거했습니다. 내가 지금 얻을 오류는 구문 오류입니다 :'AS max_r ON max_r.id = mr.id INNER JOIN record r ON mr.id = r.id' – Nick3

+0

sytax를 제대로 검사 할 수 없습니다. 쿼리를 테스트 할 수 있도록 SQlFiddle을 생성하십시오. – StanislavL

+0

http://sqlfiddle.com/#!9/430e02/1/0 테스트, 우리가 사용하는 모든 요소가 포함 된 매우 쉬운 구조를 추가했습니다. – Nick3