MySQL 5.7 vs 5.5: Einfache Abfrage dauert 50-mal länger

5

Ich habe eine Datenbank "Algebra" mit einer Tabelle "Fragen" mit 1.033.990 Zeilen. Die Datensätze haben das Attribut "Gelöst" INT. Ich habe eine einfache Frage

select count(*) from questions where solved = 0

Ich habe zwei Server mit ähnlichen CPUs. Auf beiden Servern sind die Tabellen gleich. (Datenbank ist eine Replik der Produktion). Sie sind auf SSDs. Ein Server hat Ubuntu 14.04 mit MySQL 5.5.49 und ein anderer Server hat Ubuntu 16.04 mit MySQL 5.7.12.

Das Problem ist, dass diese Abfrage unter MySQL 5.5 nur 0,009 Sekunden dauert, unter MySQL 5.7 jedoch 0,304 Sekunden. Welches ist 34-mal langsamer !!!

Die Abfragepläne sind ungefähr ähnlich:

Langsamer Server:

id      select_type     table   partitions      type    possible_keys   key     key_len ref     rows    filtered        Extra
1       SIMPLE  questions       NULL    index   NULL    by_topic_solved 97      NULL    1033990 10.00   Using where; Using index

Schneller Server:

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  questions   index   NULL    by_topic_solved 97  NULL    1033989 Using where; Using index

Warum dies der Fall sein könnte, verblüfft mich. Ich habe andere, kompliziertere Leistungsprobleme mit diesem neuen 5.7-Setup gesehen, aber dies ist das einfachste Problem, das es in Bezug auf die zugrunde liegende Abfrage zu lösen gilt.

Ich begreife, um die Erklärung dafür zu finden oder wo ich anfangen soll. my.cnf war zwischen den beiden in etwa ähnlich. Vorschläge werden dankbar angenommen.

Igor Chudov
quelle
1
Sind Sie absolut sicher, dass keiner der Server oder beide Server einen warmen Cache haben? Das heißt, welche konkreten Schritte haben Sie unternommen, um dies sicherzustellen?
ChrisInEdmonton
Auf dem problematischen langsamen Server mit MySQL 5.7 habe ich diese Abfrage viele Male wiederholt. Die resultierenden Timings waren leicht unterschiedlich, wie zwischen 0,301 und 0,309 Sekunden, aber nicht sehr. Ich glaube nicht, dass es sich um ein Cache-Problem handelt.
Igor Chudov
1
Ich habe dieses Problem vollständig verstanden. Was sich geändert hat, ist, dass in der neuen Version von mysql der Abfragecache aufgrund der Standardeinstellung von query_cache_type = OFF deaktiviert ist. Als ich den Abfragecache durch Setzen von query_cache_type = 1 wieder aktivierte, war die Leistung gleich wieder besser. Da meine Site 100-mal mehr SELECT-Abfragen als INSERT / UPDATE-Abfragen verwendet, ist die Verwendung des Abfrage-Caches für mich sinnvoll. Vielen Dank, dass Sie mich darauf hingewiesen haben, in diese Richtung zu schauen!
Igor Chudov
Igor, vielleicht möchten Sie das als Antwort hinzufügen. Nizza zu finden! Beachten Sie, dass der Abfragecache (das letzte Mal, als ich ihn überprüft habe) nur für EXACT-Übereinstimmungen funktioniert und nur, solange sich die Daten nicht ändern.
ChrisInEdmonton
Ich habe das einfach getan, ich wusste nicht, dass ich eine Antwort geben kann. Tolle Website hier. Und danke für deine Hilfe und Ermutigung, Chris.
Igor Chudov

Antworten:

6

Ich habe dieses Problem vollständig verstanden. Was sich geändert hat, ist, dass in der neuen Version von mysql der Abfragecache aufgrund der Standardeinstellung von query_cache_type = OFF deaktiviert ist. Als ich den Abfragecache durch Setzen von query_cache_type = 1 wieder aktivierte, war die Leistung gleich wieder besser. Da meine Site 100-mal mehr SELECT-Abfragen als INSERT / UPDATE-Abfragen verwendet, ist die Verwendung des Abfrage-Caches für mich sinnvoll. Vielen Dank, dass Sie mich darauf hingewiesen haben, in diese Richtung zu schauen!

Igor Chudov
quelle
Beachten Sie, dass der Abfrage-Cache hilfreich ist, wenn Sie die EXAKTE gleiche Abfrage ausführen (genau die gleiche Zeichenfolge, auch in Groß- und Kleinschreibung) UND die Tabelle unverändert bleibt. In vielen Fällen ist der Abfragecache eigentlich gar nicht so nützlich. Trotzdem sehr nette Entdeckung und vielen Dank, dass Sie Ihre Lösung geschrieben haben. Dies wird für andere hilfreich sein!
ChrisInEdmonton