Verwenden von FORCE INDEX

7

Ich war kürzlich in einer Präsentation eines Facebook MySQL-Ingenieurs und er erwähnte dort, dass die Verwendung von FORCE INDEXE / A reduziert.

Dies hatte damit zu tun, dass das MySQL Query Optimizer nicht zum Datenwörterbuch gehen und Berechnungen durchführen musste.

  • Kann jemand erklären, wie das funktioniert (vorzugsweise mit Referenzen)?
  • Ist dies eine gute Optimierungspraxis im Allgemeinen?
Jonathan
quelle
4
Eine schnelle Google-Abfrage ergab den folgenden Blog-Beitrag: Ein Fall für FORCE INDEX .
Gonsalu
1
Ich bin mir fast sicher, dass alles, was Facebook zur Optimierung seiner MySQL-Umgebung unternimmt, als extreme und hochspezialisierte Optimierung gilt, die nur in ihrem massiven Umfang massive Vorteile bringt. Die Kosten für die Verwendung FORCEliegen in der Flexibilität (Ihr Optimierer ist gebunden) und möglicherweise sogar in der Leistung (sollten Sie den falschen Index auswählen oder sollten sich die Statistiken erheblich ändern). Dennoch denke ich, dass die Antworten auf diese Frage informativ sein sollten.
Nick Chammas
1
Hey Jonathan, um diese Frage für die Site relevanter und nützlicher zu machen (und zu verhindern, dass sie geschlossen wird), habe ich sie bearbeitet, um konkretere Informationen und Empfehlungen zu erhalten, anstatt nur Links.
Nick Chammas

Antworten:

9

Eine gute Quelle für FORCE INDEX wäre das Buch MySQL Database Design and Tuning .

Design und Optimierung von MySQL-Datenbanken

Auf Seite 120 Absatz 4 heißt es:

Wo passt FORCE INDEX hin? FORCE INDEX (erstmals in Version 4.0.9 aktiviert) ist USE INDEX sehr ähnlich. Der Hauptunterschied zwischen den beiden Optionen besteht darin, dass FORCE INDEX verlangt, dass MySQL den Index (falls möglich) anstelle eines teureren Tabellenscans verwendet, während USE INDEX dem Optimierer weiterhin die Auswahl eines Tabellenscans ermöglicht.

Auf derselben Seite heißt es, dass MySQL nicht warnt, dass ein Index irrelevant ist, und im Fall von USE INDEX zu einem Tabellenscan wechselt.

Daher kann FORCE INDEX den MySQL Query Optimizer aus der Gleichung entfernen, bevor der Index verwendet wird. Jede Abfrage, die FORCE INDEX ordnungsgemäß verwendet , reduziert die E / A. Warum sage ich richtig?

Denk darüber nach. Wenn der Index, durch den Sie navigieren möchten, ein Deckungsindex ist und Sie nur die Spalten benötigen, die im Deckungsindex aufgeführt sind, ist es nicht erforderlich, die Tabelle für Daten zu kontaktieren. Alle E / A sind auf Indexseiten beschränkt. Alle angeforderten Daten werden im schlimmsten Fall durch Index-Scans abgerufen. Das ist in der Tat eine gute Sache, wenn die angeforderten Daten bestellt werden müssen, um jede angeforderte Sortierung zu umgehen.

In Bezug auf "Regeln für Engagements" sollte FORCE INDEX nur verwendet werden, wenn

  • unter Bezugnahme auf Indexe
  • Alle Spalten im Index sind klein
  • Sie tweek effektiv das Caching-Verhalten von SELECT-Abfragen
    • Verwenden Sie für Ad-hoc-Abfragen SQL_NO_CACHE
    • Zwischenspeichern Sie häufig aktualisierte Daten mit Bedacht

FORCE INDEX sollte nicht erstellt werden, um Abfragen zur Verwendung von Indizes zu zwingen, wenn Sie versuchen, einen quadratischen Stift in ein rundes Loch einzupassen. Mit anderen Worten, wenn Sie einen Index nur durchlaufen, um auf Tabellendaten in einer bestimmten Reihenfolge zuzugreifen, erhalten Sie nichts. Tatsächlich wird die Abfrageleistung unter den Bus geworfen, da keine Vorkenntnisse darüber vorliegen, wie verfügbar Ihre Daten sein müssen.

RolandoMySQLDBA
quelle