2017-08-17 1 views
0

Ich bin dabei, die Abfragen in meiner MySQL-Datenbank zu optimieren. Während ich Visual Explain verwende und verschiedene Abfragekosten anschaue, finde ich immer wieder kontra-intuitive Werte. Operationen, die effizientere Nachschlagevorgänge (z. B. Schlüsselsuche) verwenden, scheinen höhere Abfragekosten zu haben als scheinbar weniger effiziente Vorgänge (z. B. vollständige Tabellensuche oder vollständige Indexsuche).Sind Abfragekosten die beste Metrik für die MySQL-Abfrageoptimierung?

Beispiele hierfür können auch im Handbuch MySQL zu sehen sind, in dem Abschnitt in Bezug auf Sicht auf this page Erklären: enter image description here Die Abfrage Kosten für den vollständigen Tabellenscan ist ein Bruchteil der Schlüssel-Lookup-Abfrage Kosten. Ich sehe genau das gleiche Szenario in meiner eigenen Datenbank.

All dies scheint perfekt rückwärts zu mir, und wirft diese Frage auf: Soll ich Abfragekosten wie die Standard bei der Optimierung einer Abfrage verwenden? Oder habe ich die Abfragekosten grundsätzlich falsch verstanden?

+0

Am Ende des Tages ist in der Regel die "tatsächliche Leistung" am wichtigsten. Geschätzte (und tatsächliche) Abfragepläne sind nett. Auf der anderen Seite ist es in der Regel eine Anforderung, dass die relevanten Abfragen schnell ausgeführt werden. – user2864740

+0

Ich bin mir auch nicht sicher, was die Frage stellt - die Kosten der Basis-FTS sind von selbst bedeutungslos, da sie nur einen Teil der Informationen ausmachen, die zur Beantwortung der Anfrage benötigt werden.(Wenn die Tabelle einen geeigneten Index und eine ausreichende Datenmenge hat, sollte sie sich von einem vollständigen Scan zu einem Index-Scan ändern: Dieser Schritt "erstellt effektiv die anfänglichen N [1000] Zeilen". In diesem Fall hielt der Planer die Tabelle für klein genug oder hatte keinen verwendbaren Index.) – user2864740

+0

Ich verstehe, was jeder Schritt der Abfrage tut und wie es es macht. Was ich nicht verstehe, ist, dass der Abfrageplaner fast ohne Ausnahme denkt, dass indizierte Lesevorgänge teurer sind als nicht indizierte Lesevorgänge, wenn der gesunde Menschenverstand das Gegenteil behaupten würde. Zum Beispiel habe ich in meiner Datenbank eine Abfrage gefunden, die einen vollständigen Tabellenscan durchführt, also habe ich einen passenden Index hinzugefügt, der Planer hat dann diesen Index ausgewählt, aber EXPLAIN zeigte, dass die Abfragekosten ** nach dieser Änderung ** nach oben gegangen sind. –

Antwort

0

Ein Beispiel:

Sie haben eine Liste von 1000 Französisch Wörter und ein französisch-Englisch (nicht-elektronischen) Wörterbuch. Ihre Aufgabe besteht darin, eine Tabelle mit diesen 1000 französischen Wörtern und ihren englischen Übersetzungen zu erstellen.

Erster Schritt: Schreiben Sie die französischen Wörter aus der Liste in die erste Spalte Ihrer Tabelle.

Zweiter Schritt: Suchen Sie die Übersetzungen für jedes Wort im Wörterbuch und schreiben Sie sie in die zweite Spalte.

Welchen Schritt wird Ihrer Meinung nach länger dauern?

0

MySQL hat nicht sehr gute Metriken in Bezug auf die Optimierung. Einer der besseren ist EXPLAIN FORMAT=JSON SELECT ..., aber es ist etwas kryptisch.

Einige 'schwere' Fehler:

  • Selten hat etwas Konto für einen LIMIT.
  • Statistiken über Indizes sind grob und erlauben keine ungleiche Verteilung. (Histogramme kommen 'bald'.)
  • Es ist sehr wenig darüber getan, ob Daten/Indizes derzeit zwischengespeichert werden und ob es sich um ein drehendes Laufwerk oder eine SSD handelt.

Ich mag das, weil es mir zwei können vergleichen Formulierungen/Indizes/etc auch für kleine Tische, an denen Timing nutzlos nächsten ist:

FLUSH STATUS; 
perform the query 
SHOW SESSION STATUS LIKE "Handler%"; 

Es bieten genaue zählt (im Gegensatz zu EXPLAIN) von liest , schreibt (in die temporäre Tabelle) usw. Der Hauptfehler liegt darin, nicht zu unterscheiden, wie lange ein Lese-/Schreibvorgang dauerte (aufgrund von Caching, Indexsuche usw.). Es ist jedoch oft sehr gut darauf hinzuweisen, ob eine Abfrage einen Tabellen-/Index-Scan im Vergleich zu einem Suchvorgang im Vergleich zu mehreren Scans durchgeführt hat.

Verwandte Themen