Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Indizes – was sind die Best Practices?

Sie sollten auf jeden Fall einige Zeit damit verbringen, sich über Indexierung zu informieren, es wird viel darüber geschrieben, und es ist wichtig zu verstehen, was vor sich geht.

Allgemein gesagt legt ein Index eine Reihenfolge für die Zeilen einer Tabelle fest.

Stellen Sie sich der Einfachheit halber vor, dass eine Tabelle nur eine große CSV-Datei ist. Immer wenn eine Zeile eingefügt wird, wird sie am Ende eingefügt . Die "natürliche" Reihenfolge der Tabelle ist also nur die Reihenfolge, in der Zeilen eingefügt wurden.

Stellen Sie sich vor, Sie haben diese CSV-Datei in eine sehr rudimentäre Tabellenkalkulationsanwendung geladen. Diese Tabelle zeigt lediglich die Daten an und nummeriert die Zeilen in fortlaufender Reihenfolge.

Stellen Sie sich nun vor, dass Sie alle Zeilen finden müssen, die in der dritten Spalte einen Wert "M" haben. Angesichts dessen, was Sie zur Verfügung haben, haben Sie nur eine Option. Sie scannen die Tabelle und überprüfen den Wert der dritten Spalte für jede Zeile. Wenn Sie viele Zeilen haben, kann diese Methode (ein "Table Scan") sehr lange dauern!

Stellen Sie sich nun vor, dass Sie zusätzlich zu dieser Tabelle einen Index haben. Dieser bestimmte Index ist der Index der Werte in der dritten Spalte. Der Index listet alle Werte aus der dritten Spalte in einer sinnvollen Reihenfolge (z. B. alphabetisch) auf und bietet für jeden von ihnen eine Liste mit Zeilennummern, in denen dieser Wert erscheint.

Jetzt haben Sie eine gute Strategie, um alle Zeilen zu finden, in denen der Wert der dritten Spalte "M" ist. Beispielsweise können Sie eine binäre Suche durchführen ! Während Sie beim Tabellenscan N Zeilen durchsuchen müssen (wobei N die Anzahl der Zeilen ist), müssen Sie bei der binären Suche im schlimmsten Fall nur log-n Indexeinträge betrachten. Wow, das ist sicher viel einfacher!

Wenn Sie diesen Index haben und der Tabelle Zeilen hinzufügen (am Ende, da unsere konzeptionelle Tabelle so funktioniert), müssen Sie den Index natürlich jedes Mal aktualisieren. Sie arbeiten also etwas mehr, während Sie neue Zeilen schreiben, aber Sie sparen eine Menge Zeit, wenn Sie nach etwas suchen.

Im Allgemeinen schafft die Indizierung also einen Kompromiss zwischen Leseeffizienz und Schreibeffizienz. Ohne Indizes können Einfügungen sehr schnell sein – die Datenbank-Engine fügt einfach eine Zeile zur Tabelle hinzu. Wenn Sie Indizes hinzufügen, muss die Engine jeden Index aktualisieren, während die Einfügung durchgeführt wird.

Auf der anderen Seite werden Lesevorgänge viel schneller.

Hoffentlich deckt das Ihre ersten beiden Fragen ab (wie andere geantwortet haben – Sie müssen das richtige Gleichgewicht finden).

Ihr drittes Szenario ist etwas komplizierter. Wenn Sie LIKE verwenden, helfen Indizierungs-Engines normalerweise bei Ihrer Lesegeschwindigkeit bis zum ersten "%". Mit anderen Worten, wenn Sie WHERE-Spalte LIKE 'foo%bar%' auswählen, verwendet die Datenbank den Index, um alle Zeilen zu finden, in denen die Spalte mit "foo" beginnt, und muss dann dieses Zwischenrowset scannen, um die Teilmenge zu finden das enthält "bar". SELECT ... WHERE Spalte LIKE '%bar%' kann den Index nicht verwenden. Ich hoffe, Sie können verstehen, warum.

Schließlich müssen Sie anfangen, über Indizes für mehr als eine Spalte nachzudenken. Das Konzept ist das gleiche und verhält sich ähnlich wie das LIKE-Zeug – im Wesentlichen, wenn Sie einen Index auf (a,b,c) haben, wird die Engine den Index so gut wie möglich von links nach rechts verwenden. Eine Suche in Spalte a könnte also den Index (a,b,c) verwenden, ebenso wie eine Suche in (a,b). Die Engine müsste jedoch einen vollständigen Tabellenscan durchführen, wenn Sie WHERE b=5 AND c=1)

suchen

Hoffentlich hilft dies, ein wenig Licht ins Dunkel zu bringen, aber ich muss wiederholen, dass Sie am besten ein paar Stunden damit verbringen, nach guten Artikeln zu suchen, die diese Dinge ausführlich erklären. Es ist auch eine gute Idee, die Dokumentation Ihres jeweiligen Datenbankservers zu lesen. Die Art und Weise, wie Indizes von Abfrageplanern implementiert und verwendet werden, kann sehr unterschiedlich sein.