Ich habe eine SQL-Abfrage, die meiner Meinung nach viel zu lange dauert, etwa 30 Sekunden, wie es jetzt aussieht. Ich habe zwei Tabellen, Record
und Mainrecord
. Ich möchte Informationen über alle Mainrecords erhalten, die 0 in der Spalte Menge haben, und auch in diesem Fall den neuesten Record mit der gleichen ID, die etwas anderes als 0 in seiner eigenen Menge hat. Ich habe ungefähr 30.000 Hauptbücher und ungefähr 3.000.000 Aufzeichnungen. Ich denke, dass dies in gewisser Weise optimiert werden kann, aber ich kann es nicht herausfinden.Inner Join zwischen Tabellen, zeitaufwendig
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
ERKLÄREN:
+----+-------------+------------+-------------+---------------+-----------+---------+---------------------+---------+----------+---------------------------------------+
| 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 |
+----+-------------+------------+-------------+---------------+-----------+---------+---------------------+---------+----------+---------------------------------------+
Haben Sie Indizes? Bitte fügen Sie der Frage auch 'Explain'-Ergebnisse hinzu. – Shaharyar
Wer ist Hauptregister Tabelle? –
@Shaharyar, sowohl id als auch amout sind Schlüssel in beiden Tabellen. – Nick3