ich nicht brillant bin, wenn es darum geht, über die Grundlagen mit MySQL zu gehen, aber ich versuche, eine Abfrage zu optimieren:Indizes und Optimierung
SELECT DATE_FORMAT(t.completed, '%H') AS hour, t.orderId, t.completed as stamp,
t.deadline as deadline, t.completedBy as user, p.largeFormat as largeFormat
FROM tasks t
JOIN orders o ON o.id=t.orderId
JOIN products p ON p.id=o.productId
WHERE DATE(t.completed) = '2013-09-11'
AND t.type = 7
AND t.completedBy IN ('user1', 'user2')
AND t.suspended = '0'
AND o.shanleys = 0
LIMIT 0,100
+----+-------------+-------+--------+----------------------------+-----------+---------+-----------------+-------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+----------------------------+-----------+---------+-----------------+-------+-------------+
| 1 | SIMPLE | o | ref | PRIMARY,productId,shanleys | shanleys | 2 | const | 54464 | Using where |
| 1 | SIMPLE | p | eq_ref | PRIMARY | PRIMARY | 4 | sfp.o.productId | 1 | |
| 1 | SIMPLE | t | ref | NewIndex1 | NewIndex1 | 5 | sfp.o.id | 6 | Using where |
+----+-------------+-------+--------+----------------------------+-----------+---------+-----------------+-------+-------------+
Bevor einige der Indizes hinzugefügt wurden, wurde die Durchführung Vollständige Tabelle scannt sowohl in der Tabelle als auch in der Tabelle o
.
Im Grunde, dachte ich, dass MySQL würde:
Grenze nach unten die Zeilen aus der Aufgaben-Tabelle mit den where-Klauseln (sollte 84 Zeilen sein, ohne dass die Verbindungen)
dann auf die Produkte der Auftragstabelle durch Tabelle, um eine Flagge zu erhalten (largeFormat
).
Meine Fragen sind, warum MySQL 50000+ Zeilen nachschlägt, wenn es nur 84 verschiedene IDs zu suchen gibt, und gibt es eine Möglichkeit, die Abfrage zu optimieren?
Ich kann keine neuen Felder oder neue Tabellen hinzufügen.
Vielen Dank im Voraus!
Das sieht ziemlich gut aus. Ist Leistung ein Problem? – Strawberry
Ich habe @ DRapps Antwort unten verwendet, im Wesentlichen die Verwendung der Datumsfunktion führte dazu, dass das Nachschlagen 7,98 Sekunden dauerte und jetzt 0,04 Sekunden dauert. : p –