MySQL-Profil bei Abfrage "Sortierindex erstellen" mit 75% der Gesamtzeit


10

Wir versuchen herauszufinden, wie eine Abfrage optimiert werden kann (ca. 100 ms) und welches Profil wir unter Creating Sort IndexVerwendung 75%der Gesamtzeit ausführen . Was genau bewirkt die Erstellung des Sortierindex? Ist es disk / io?

Zweitens können wir die Abfrage selbst optimieren?

SELECT r.`id`, 
       r.name, 
       r.public_uri, 
       rv.version, 
       rv.interpreter, 
       rv.notes, 
       rv.content, 
       r.added, 
       r.added_by, 
       r.modified, 
       r.modified_by, 
       r.public, 
       r.public_by
  FROM recipe_heads rh, 
       recipes r, 
       recipe_versions rv
 WHERE rh.recipe = r.`id` 
   AND rh.recipe_version = rv.`id` 
   AND r.`id` = rv.recipe
ORDER BY r.added DESC

Erklären: Bildschirmfoto

Antworten:


6

Wir hatten ein ähnliches Problem bei großen Anfragen. Häufig wurden Abfragen stundenlang ausgeführt (bis zu 7-8), abhängig von der Belastung der Datenbank für 400 Millionen Zeilen. Unser Ziel war es jedoch, Gruppenergebnisse wie Select Col1, Col2, Col3, Count (1), Count (verschiedene Col4) aus der Tabellengruppe um 1,2,3 zu erzielen.

Das zugrunde liegende Problem ist jedoch dasselbe wie bei Ihnen, da DB in beiden Fällen die Ergebnisse intern sortiert (ordnet).

  • So erstellen Sie einen Sortierindex. Auf der MySQL-Website heißt es: "Der Thread verarbeitet ein SELECT, das mithilfe einer internen temporären Tabelle aufgelöst wird." Nach meinem Verständnis des Algorithmus teilt das System Daten höchstwahrscheinlich in Blöcke auf, liest diese Blöcke einzeln von der Festplatte, sortiert einzelne Blöcke, legt sie auf temporären Speicherplatz zurück und so weiter. Das System führt dies für alle Chunks aus und führt schließlich eine Zusammenführungssortierung durch. Dies beinhaltet umfangreiche Lese- / Schreibvorgänge.

Eine mögliche Lösung kann darin bestehen, den Arbeitsspeicher für die Datenbank zu erhöhen (damit größere Blöcke erstellt werden, die im Arbeitsspeicher verbleiben können). Wenn Sie an einer anderen Stelle über einen größeren Arbeitsspeicher verfügen, können Sie die Lösung durch Streaming aus der Datenbank programmieren. Dies kann in kürzester Zeit erreicht werden.

Programmatisch konnte ich die Zeit von durchschnittlich 2 Stunden auf konstant 7,5 Minuten reduzieren.


4

'Sortierindex erstellen' ist die Datenbank, die die Reihenfolge Ihrer zurückgegebenen Werte anhand Ihrer 'order by'-Klausel ermittelt. Hauptbegrenzer wären hier die verfügbare CPU / CPU-Geschwindigkeit und die Speicherbandbreite. Die Sortierung wird erst durchgeführt, wenn sich alle Daten bereits im Speicher befinden, zumindest für eine so kleine Abfrage. Wenn Sie die Abfrage profilieren, werden Wartezeiten für Ressourcen angezeigt?

Um diese Abfrage schneller zu machen, können Sie einen Index für 'r.added' hinzufügen, da es Ihrer Erklärung nach nicht so aussieht, als gäbe es einen.


Rezepte haben in addedder Tat einen Standardindex.
Justin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.