Schrecklicher Rückgang der MySQL-Leistung nach dem Upgrade auf Ubuntu 16.04 MySQL 5.7.12

2

Ich habe einen Entwicklungsserver, den ich kürzlich von 14.04 auf 16.04 aktualisiert habe.

Ich habe eine Datenbank 'Algebra', die Daten für meine Website algebra.com hostet. Es handelt sich um eine Q & A-Website mit Fragen und Antworten und einer Beziehung von 1 zu N.

Nach dem Upgrade hat sich die Leistung derselben Datenbankabfragen dramatisch verschlechtert.

Beispielsweise dauerte eine Abfrage, bei der Fragen und Antworten nach Fragen-ID verknüpft werden, weniger als eine halbe Sekunde. Nach dem Upgrade dauert es eine Minute.

Da es sich um einen Entwicklungsserver handelt, kann ich ihn mit dem Produktionsserver vergleichen, auf dem Ubuntu 14.04 noch ausgeführt wird und dessen Abfrage nur 0,38 Sekunden dauert.

Hier sind die Abfragepläne

mysql> explain SELECT 
    ->     questions.id, questions.email, questions.topic, questions.question,  
    ->     questions.date, 
    ->     questions.deleted, 
    ->     questions.is_spam, 
    ->     questions.solved, 
    ->  
    ->     questions.tb_id, 
    ->     questions.tb_isbn, 
    ->     questions.tb_title, 
    ->     questions.tb_edition, 
    ->     questions.tb_chapter, 
    ->     questions.tb_problem, 
    ->  
    ->     solutions.id, solutions.author author, solutions.date, solutions.answer 
    -> FROM questions, solutions 
    -> WHERE 
    ->      questions.solved = 1 
    ->      AND questions.id = solutions.question 
    ->      AND questions.deleted != 1 
    ->      AND questions.is_spam != 1 
    -> ORDER BY solutions.date DESC 
    -> LIMIT 50; 

Auf dem "Good Server":

+----+-------------+-----------+--------+-----------------------+---------+---------+----------------------------+--------+----------------+
| id | select_type | table     | type   | possible_keys         | key     | key_len | ref                        | rows   | Extra          |
+----+-------------+-----------+--------+-----------------------+---------+---------+----------------------------+--------+----------------+
|  1 | SIMPLE      | solutions | ALL    | solutions_by_question | NULL    | NULL    | NULL                       | 650770 | Using filesort |
|  1 | SIMPLE      | questions | eq_ref | PRIMARY               | PRIMARY | 4       | algebra.solutions.question |      1 | Using where    |
+----+-------------+-----------+--------+-----------------------+---------+---------+----------------------------+--------+----------------+
2 rows in set (0.00 sec)

Auf dem "Bad Server:

+----+-------------+-----------+------------+------+-----------------------+-----------------------+---------+----------------------+--------+----------+----------------------------------------------+
| id | select_type | table     | partitions | type | possible_keys         | key                   | key_len | ref                  | rows   | filtered | Extra                                        |
+----+-------------+-----------+------------+------+-----------------------+-----------------------+---------+----------------------+--------+----------+----------------------------------------------+
|  1 | SIMPLE      | questions | NULL       | ALL  | PRIMARY               | NULL                  | NULL    | NULL                 | 482186 |     8.10 | Using where; Using temporary; Using filesort |
|  1 | SIMPLE      | solutions | NULL       | ref  | solutions_by_question | solutions_by_question | 4       | algebra.questions.id |      1 |   100.00 | Using index condition                        |
+----+-------------+-----------+------------+------+-----------------------+-----------------------+---------+----------------------+--------+----------+----------------------------------------------+

Der Datenbankinhalt ist mehr oder weniger derselbe, die Entwicklungsdatenbank ist eine Sicherung des Servers von letzter Nacht.

Irgendwelche Ideen, wo ich diese wilde Gänsejagd beginnen kann, um den Leistungsabfall zu verstehen?

Vielen Dank!

Igor Chudov
quelle
Versuchen Sie es mit einem expliziten Join. Sind die Daten auch gleich?
Daniel B
Sie haben sehr unterschiedliche Ausgaben für den guten und den schlechten Server ...
DavidPostill
Sie müssen verschiedene Versionen von MYSQL ausführen, da Ihre Ergebnisse unterschiedlich sind. Eine gibt 640.000 Zeilen zurück, die andere 450.000. Die MySQL-Version ist also eindeutig dafür verantwortlich, dass wahrscheinlich eine dokumentierte Änderung dazu führt, dass die Abfrage unterschiedliche Ergebnisse zurückgibt. Die Spalten "Extra" und "Schlüssel" enthalten alle Informationen, die Sie benötigen.
Ramhound
Was speziell an der Abfrage falsch ist, ist hier leider nicht möglich.
Ramhound
Ja, die Daten sind die gleichen (ein Tag Unterschied). Ich verwende in der Tat verschiedene Versionen von MySQL, da ich, wie der Titel und die Beschreibung besagen, ein Upgrade auf eine zwei Jahre neuere Version von Ubuntu durchgeführt habe. Dies sieht nach einer sehr langweiligen und abwechslungsreichen Abfrage aus, und ich bin überrascht, dass mysql im 21. Jahrhundert damit nicht fertig wurde, obwohl eine zwei Jahre alte Version damit klar gekommen ist.
Igor Chudov

Antworten:

1

Wenn Sie auf einen Ubuntu-Server mit 16.04 aktualisiert haben und 5.7.12 verwenden, stoßen Sie - zumindest teilweise - auf einen Fehler, der den Arbeitsspeicher verschlingt, und auf einige dynamische Optimierungen / Standardeinstellungen, die auf dem verfügbaren Arbeitsspeicher des Servers basieren weniger als ideal einstellen. Dies war für viele Menschen problematisch, vor allem aber für kleinere Server / VPS mit wenig RAM.

Durchsuchen Sie laracasts.com nach MySQL 5.7 Memory Leak

https://www.reddit.com/r/mysql/comments/4gnj93/mysql_5712_ubuntu_1604_ridiculous_memory/

Es gibt andere Probleme, von denen einige 5.7.13 natürlich behoben wurden ...

http://mysqlentomologist.blogspot.com/2016/06/fun-with-bugs-43-bugs-fixed-in-mysql.html

Es wurden auch verschiedene Optimierungen / Änderungen vorgenommen, die sich darauf auswirken, ob Sie InnoDB oder MyISAM verwenden oder nicht. Beispielsweise steigt ein kürzlich installierter VPS mit 2 GB RAM, der bei einem Neustart von MySQL etwa 320 MB RAM verbraucht, langsam an, bis 1 GB in einer inaktiven App im Wartungsmodus verbraucht werden war eine OpenCart-Installation, die MyISAM verwendet ... was ich niemandem wünschen möchte, der versucht, voranzukommen ... aber das war ein Fall von "beeilen Sie sich und lassen Sie uns dies tun und dies verwenden und ...") . Und so benötigt diese bestimmte Instanz mehr Geld und Zeit, um zurück zu gehen und sich mit demselben schlechten Leistungsproblem von MySQL zu befassen, da sich das Oracle-Team auf MyISAM in der App, einen Speicherverlust und einige schlechte Standardeinstellungen verlassen hat.

Sicher, Sie möchten wahrscheinlich Ihre Abfragen und Verknüpfungen für die neuen Updates optimieren. Aber gleichzeitig werden Sie wahrscheinlich viel Mühe verschwenden und nichts erreichen, da der zugrunde liegende Speicher wie ein Siebproblem ausläuft. Wenn Sie Optimierungen vornehmen, können Sie dies auch mit einem anderen MySQL-Server tun als dem, der Probleme für Sie verursacht.

Ihre Optionen sind, wenn man bedenkt, wie langsam MySQL Fehler behebt:

1) Fahren Sie es raus und warten Sie auf Repo-Updates, die es reparieren

2) deinstalliere die aktuelle Version und gehe zurück zu einer vorherigen (aber warum?)

3) Ersetzen Sie es durch MariaDB oder Percona

Wenn Sie einen neuen Ubuntu 16.04-Server starten, würde ich die Repositorys ändern, bevor ich Benutzeragenten für die Remoteverwaltung verbinde oder Server-Management-Panels installiere, sodass Sie sich auf einem MariaDB / Percona-Track befinden. Oder verfolgen Sie die offiziellen MySQL-Repos und nicht die Ubuntu-Repos, damit Sie schneller Fehler beheben können.

Die sichere und sofortige Lösung (sicherlich klüger als die Verlängerung der Verwendung früherer Versionen mit Fehlern und einem wichtigen Kompatibilitätsproblem im Release-Stream) ist die Umstellung auf MariaDB oder Percona. Wenn Sie eine App verwenden, die sowohl PostgreSQL als auch MySQL verwenden kann, wechseln Sie zu Postgre - wenn dies nicht unpraktisch ist.

Ich würde meine Zeit nicht damit verschwenden, die Datenbank zu optimieren, bis ich auf 5.7.13 aktualisiert und die Ergebnisse überwacht oder zu MariaDB oder Percona gewechselt habe. Die Optimierung / Fehlerbehebung von 5.7.12 ist nur ein Schwarzes Loch, das Ihre Zeit und Ressourcen beansprucht.

Sean Wilson
quelle