Ich habe eine MySQL-Datenbank mit InnoDB Tabellen zusammenfassend über 10 zehn GB Daten, die ich von MySQL 5.5 auf MySQL 5.7 migrieren möchte. Und ich habe eine Abfrage, die ein bisschen wie folgt aussieht:Abfrage extrem langsam nach der Migration auf MySQL 5.7
SELECT dates.date, count(mySub2.myColumn1), sum(mySub2.myColumn2)
FROM (
SELECT date
FROM dates -- just a table containing all possible dates next 5 years
WHERE date BETWEEN '2016-06-01' AND '2016-09-03'
) AS dates
LEFT JOIN (
SELECT o.id, time_start, time_end
FROM order AS o
INNER JOIN order_items AS oi on oi.order_id = o.id
WHERE time_start BETWEEN '2016-06-01' AND '2016-09-03'
) AS mySub1 ON dates.date >= mySub1.time_start AND dates.date < mySub1.time_end
LEFT JOIN (
SELECT o.id, time_start, time_end
FROM order AS o
INNER JOIN order_items AS oi on oi.order_id = o.id
WHERE o.shop_id = 50 AND time_start BETWEEN '2016-06-01' AND '2016-09-03'
) AS mySub2 ON dates.date >= mySub2.time_start AND dates.date < mySub2.time_end
GROUP BY dates.date;
Mein Problem ist, dass diese Abfrage ausführt schnell in MySQL 5.5, aber extrem langsam in MySQL 5.7.
In MySQL 5.5 dauert es mehr als 1 Sekunde und < 0,001 Sekunden jede wiederkehrende Ausführung ohne Neustart von MySQL.
In MySQL 5.7 dauert es mehr als 11,5 Sekunden und 1,4 Sekunden bei jeder wiederkehrenden Ausführung, ohne MySQL neu zu starten.
Und je mehr LINKE JOINs ich der Abfrage hinzufügen, desto langsamer wird die Abfrage in MySQL 5.7.
Beide Instanzen laufen jetzt auf demselben Computer, auf derselben Festplatte und mit denselben my.ini-Einstellungen. Es ist also keine Hardware.
Die Ausführungspläne unterscheiden sich jedoch, und ich weiß nicht, was ich daraus machen soll.
Dies ist die 5,5 VERLÄNGERT auf MySQL EXPLAIN:
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | extra |
|----|-------------|------------|-------|---------------|-------------|---------|-----------|-------|----------|---------------------------------|
| 1 | PRIMARY | dates | ALL | | | | | 95 | 100.00 | Using temporary; Using filesort |
| 1 | PRIMARY | <derived2> | ALL | | | | | 281 | 100.00 | '' |
| 1 | PRIMARY | <derived3> | ALL | | | | | 100 | 100.00 | '' |
| 3 | DERIVED | o | ref | xxxxxx | shop_id_fk | 4 | '' | 1736 | 100.00 | '' |
| 3 | DERIVED | oc | ref | xxxxx | order_id_fk | 4 | myDb.o.id | 1 | 100.00 | Using index |
| 2 | DERIVED | o | range | xxxx | date_start | 3 | | 17938 | 100.00 | Using where |
| 2 | DERIVED | oc | ref | xxx | order_id_fk | 4 | myDb.o.id | 1 | 100.00 | Using where |
Dies ist die auf MySQL 5.7 ausgefahren ist Explain:
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | extra |
|----|-------------|-------|--------|---------------|-------------|---------|------------------|------|----------|----------------|
| 1 | SIMPLE | dates | ALL | | | | | 95 | 100.00 | Using filesort |
| 1 | SIMPLE | oi | ref | xxxxxx | order_id_fk | 4 | const | 228 | 100.00 | |
| 1 | SIMPLE | o | eq_ref | xxxxx | PRIMARY | 4 | myDb.oi.order_id | 1 | 100.00 | Using where |
| 1 | SIMPLE | o | ref | xxxx | shop_id_fk | 4 | const | 65 | 100.00 | Using where |
| 1 | SIMPLE | oi | ref | xxx | order_id_fk | 4 | myDb.o.id | 1 | 100.00 | Using where |
ich verstehen will, warum die MySQLs die gleiche Abfrage behandeln, die viel anders und wie kann ich MySQL 5.7 optimieren, um schneller zu sein?
Ich bin nicht auf der Suche nach Hilfe beim Neuschreiben der Abfrage, um schneller zu sein, da das ist etwas, das ich bereits alleine mache.
Nur um sicher zu gehen ... (1) die Abfragen sind genau die gleichen? (2) die Tabellen, einschließlich der Indizes, sind genau gleich? – Uueerdo
@Uueerdo ja, genau. Zuerst war es auf verschiedenen Maschinen. Aber als ich das entdeckte, installierte ich sowohl MySQL 5.5 als auch MySQL 5.7 auf meinem Laptop und importierte den gleichen Dump zweimal. Und ich nahm die gleiche my.ini und machte ein Minimum an Änderungen, damit ich die beiden Instanzen auf einmal ausführen konnte. Also ist alles gleich. Und nur dann habe ich dieselbe Abfrage auf sie ausgeführt. –
Ich habe dann keine Ahnung. Meine Vermutung wäre, dass Optimierungen für häufigere Arten von Abfragen vorgenommen würden, die sich negativ auf diese spezielle (und seltsame) Abfrage auswirken würden. – Uueerdo