nie jestem genialny jeśli chodzi o dzieje poza podstawy z MySQL, jednak staram się optymalizować zapytania:Indeksy i optymalizacja
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 |
+----+-------------+-------+--------+----------------------------+-----------+---------+-----------------+-------+-------------+
Przed niektórych indeksów dodano było wykonanie pełne skanowanie tabeli zarówno na stole p
, jak i na stole o
.
Zasadniczo, myślałem, że MySQL będzie:
granica wzdłuż rzędów z tabeli zadań z klauzul WHERE (powinno być 84 rzędów bez sprzężeń)
następnie przejść tabeli zamówień na produkty tabela, aby uzyskać flagę (largeFormat
).
Moje pytanie brzmi, dlaczego MySQL sprawdza nawet 50000 wierszy, gdy szuka tylko 84 różnych identyfikatorów i czy mogę zoptymalizować zapytanie?
Nie mogę dodać nowych pól ani nowych tabel.
Z góry dziękuję!
To wygląda całkiem nieźle. Czy wydajność jest problemem? – Strawberry
Użyłem odpowiedzi @ DRapp poniżej, w zasadzie za pomocą funkcji daty spowodowałam, że wygląd wziął 7,98 s, a teraz zajmuje 0,04 s. : p –