Christian Kruse: Extreme Performance-Unterschiede zwischen MariaDB und MySQL?

Beitrag lesen

Hallo Felix,

Wer hat Hinweise oder Ideen, worin der Performance-Unterschied bei den beiden Servern liegen könnte?

Ein EXPLAIN sowie die Datenstrukturen sollten bei so einer Frage nicht fehlen.

Es fällt jedoch auf:

Reihenfolge Status Zeit
1 Starting 19 µs
2 Waiting For Query Cache Lock 4 µs
3 Init 3 µs
4 Checking Query Cache For Query 12 µs
5 Checking Privileges On Cached 11 µs
6 Checking Permissions 11 µs
7 Checking Permissions 3 µs
8 Checking Permissions 3 µs
9 Checking Permissions 3 µs
10 Checking Permissions 3 µs
11 Checking Permissions 3 µs
12 Checking Permissions 3 µs
13 Checking Permissions 3 µs
14 Checking Permissions 3 µs
15 Checking Permissions 3 µs
16 Checking Permissions 4 µs
17 Checking Permissions 3 µs
18 Checking Permissions 3 µs
19 Checking Permissions 3 µs
20 Sending Cached Result To Clien 11 µs
21 Updating Status 4 µs
22 Cleaning Up 4 µs

Die Query kommt direkt aus dem Cache und wir in einem Rutsch rübergeschickt (siehe Checking Query Cache For Query und Checking Privileges On Cached). Um das realistisch zu prüfen würde ich den Cache auf der Entwicklungsmaschine mal deaktivieren (query_cache_size und query_cache_type in der my.cnf auf 0 setzen und MariaDB neu starten).

Reihenfolge Status Zeit
1 Sending Data 1,3 ms
2 Executing 5 µs
[…]
90 End 8 µs
91 Query End 7 µs
92 Removing Tmp Table 8 µs
93 Query End 64 µs
94 Removing Tmp Table 4 µs
95 Query End 7 µs
96 Removing Tmp Table 13 µs
97 Query End 5 µs
98 Closing Tables 30 µs
99 Freeing Items 34 µs
100 Cleaning Up 12 µs

Hier werden drei temporäre Tabellen erstellt. Außerdem wird das Ergebnis sehr fragmentiert übertragen (siehe die vielen executing und sending-Einträge). Ist der MySQL-Server auf der gleichen Maschine? Ist Netzwerk ein Flaschenhals? Wie groß ist das Resultset? Wie sieht die Speicher-Auslastung auf der DB-Maschine aus? Prüfe auch, ob der Tablespace für temporäre Tabellen auf einer drehenden Platte ist oder auf einer SSD. Prüfe vielleicht, warum der Server überhaupt temporäre Tabellen erstellen muss: ist er vielleicht unter memory pressure? Wie sieht die IO-Auslastung aus?

Das sind alles Allgemeinplätze, aber viel mehr kann man dazu nicht sagen ohne genauere Informationen…

Der SQL-Code der Query ist 60 Zeilen lang:

[…]

Drei correlating subqueries – ist vielleicht auch nicht so optimal. Das könnte schon auch ein Grund für die temporären Tabellen sein. Kannst du das vielleicht umformulieren?

Freundliche Grüße,
Christian Kruse