내 생각에 너무 오래 걸리는 SQL 쿼리가 있습니다. 약 30 초가 걸립니다. 두 테이블, Record
및 Mainrecord
이 있습니다. 나는 열의 양이 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 |
+----+-------------+------------+-------------+---------------+-----------+---------+---------------------+---------+----------+---------------------------------------+
당신에게 어떤 지표를 수행 업데이트] 하위 쿼리
에서 그룹을 추출하기 위해? 또한 'Explain'결과를 질문에 추가하십시오. – Shaharyar
메인 레코드 테이블은 누구입니까? –
@Shaharyar, id 및 amout은 모두 두 테이블의 키입니다. – Nick3