MySQL-Indizes - wie viele sind genug?
Ich versuche, die Feinabstimmung mein MySQL-server, damit ich meine Einstellungen, die Analyse slow-query-log, und vereinfachen Sie meine Fragen, wenn möglich.
Manchmal reicht es, wenn ich die Indizierung korrekt, manchmal nicht. Ich habe irgendwo gelesen (bitte korrigieren Sie mich, wenn dies ist Dummheit), dass mehr Indizes als ich brauche, machen Sie den gleichen Effekt, wie wenn ich keine Indizes.
Wie viele Indizes sind genug? Sie können sagen, es hängt von Hunderten von Faktoren, aber ich bin neugierig, wie kann ich bereinigen meine mysql-slow.log
genug Serverlast zu reduzieren.
Außerdem sah ich einige "interessante" log-Einträge wie dieser:
# Query_time: 0 Lock_time: 0 Rows_sent: 22 Rows_examined: 44
SELECT * FROM `categories` ORDER BY `orderid` ASC;
Betreffende Tabelle enthält genau 22 Zeilen -, index-set in orderid
. Warum ist diese Abfrage zeigt sich in der log, nachdem alle? Warum untersuchen, 44 Zeilen, wenn es enthält nur 22?
- Ich denke, es hat eine Art, so es irgendwie untersucht Sie die gleiche Zeile mehrfach 😡
- Was zurückgegeben wird ERKLÄREN, SELECT * FROM
categories
UM DURCHorderid
ASC; - Bemrose: Wenn ich korrigieren, es gibt ein Extra: Using filesort. Vielleicht ist das das problem?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Betrag der Indexierung und die Linie zu tun, zu viel hängt von einer Menge Faktoren ab. Auf kleinen Tischen wie Ihre "Kategorien" - Tabelle, die Sie in der Regel nicht wollen oder brauchen einen index, und es kann tatsächlich die Leistung beeinträchtigen. Der Grund dafür ist, dass es dauert, I/O (D. H. Zeit) zum Lesen von index-und dann noch mehr I/O und Zeit, um die Datensätze abrufen, die im Zusammenhang mit den übereinstimmenden Zeilen an. Eine Ausnahme ist, wenn du nur eine Abfrage der Spalten, die in den index.
In deinem Beispiel sind Sie abrufen alle Spalten und mit nur 22 Zeilen und kann es schneller sein, nur das zu tun, eine Tabelle Scannen und Sortieren diese statt über den index. Der Optimierer kann/sollte, dies zu tun und ignorieren den index. Wenn das der Fall ist, dann ist der index nur Platz wegnimmt ohne nutzen. Wenn Ihr "Kategorien" - Tabelle zugegriffen wird oft, möchten Sie vielleicht zu prüfen, pinning es in den Speicher, so der db-server hält es zugänglich, ohne zu springen die Festplatte die ganze Zeit.
Beim hinzufügen von Indizes, die Sie benötigen, um die balance aus Speicherplatz -, Abfrage-performance und die Leistung aktualisieren und einfügen in die Tabellen. Sie können sich mit mehr Indizes auf Tabellen, die sind statisch und ändern sich nicht viel im Gegensatz zu Tabellen mit Millionen updates pro Tag. Beginnen Sie das Gefühl, die Auswirkungen von index-Pflege an diesem Punkt. Was ist akzeptabel in Ihrer Umgebung aber ist und kann nur bestimmt werden, indem Sie und Ihre Organisation.
Wenn dabei Ihre Analyse, sicher sein, zu erzeugen/aktualisieren Sie Ihre Tabelle und index-Statistiken, so dass Sie sicher sein können, genaue Berechnungen.
pin
eine Tabelle in den Speicher?Als Allgemeine Regel sollten Sie Indizes für alle Primärschlüssel (Sie haben keine Wahl in diesem), alle foreign keys, und alle anderen Felder, die Sie Häufig verwenden, zum abrufen von Zeilen.
Wenn ich zum Beispiel Häufig suchen Benutzer nach Benutzername, ich hätte indiziert, auch wenn die Benutzer-ID der Primärschlüssel.
Wie viele Indizes hängt ganz davon ab, die Anfragen laufen, welche Arten von Verknüpfungen, die durchgeführt werden (falls vorhanden), die Art der Daten in der Tabelle gespeichert ist und wie groß die Tabellen sind (wie auch von vielen anderen Faktoren). Es gibt wirklich keine exakte Wissenschaft, um es. Das größte Werkzeug in Ihrem arsenal, um herauszufinden, wie um eine Abfrage zu optimieren ist erklären. Mit erklären, können Sie herausfinden, welche Art von Verknüpfungen sind unten zu sein, was mögliche Schlüssel verwendet werden könnten und die-Taste (falls vorhanden) verwendet wurde, und wie viele Zeilen untersucht wurden für jede Tabelle in der Verknüpfung.
Mithilfe dieser Informationen können Sie entscheiden, wie Sie die Schlüssel Ihre Tabellen und/oder ändern Sie Ihre Abfragen, um Sie effizienter zu machen. Die syntax für die zu erklären ist sehr einfach.
Beachten Sie, erklären nicht eigentlich die Abfrage ausführen. Also, wenn Sie diese zum Debuggen einer Abfrage, dauert 5 Minuten, zu laufen, zu erklären, wird immer noch sehr schnell.
Tun Sie müssen vorsichtig sein, beim hinzufügen von Indizes, obwohl, wie Sie tun verursachen inserts und updates, langsamer gehen und auf sehr große Tabellen, die diese Leistung schlagen kann, bemerkbar. Besonders wenn die gleiche Tabelle verwendet wird, für viel liest. Während Sie eine Menge von Indizes in der Regel nicht zu töten, die Leistung einer Abfrage, sollte man nur noch hinzufügen yo
Beachten Sie auch, dass MySQL maximal ein index pro wählen Sie Aussage (obwohl wenn Sie einen join, Sie können auch mit einem für jede join). So Indizierung nur weil ist eine Verschwendung von Speicherplatz und verlangsamen die Datenbank heruntergefahren auf schreibt. Wenn Sie Häufig verwenden Sie eine where-Anweisung, die auf zwei Spalten einen index, der diese beiden Spalten, es wird deutlich schneller als die Indizierung nur einer allein.
Einen index beschleunigen kann, eine SELECT-Abfrage, aber es wird sich verlangsamen INSERT/UPDATE/DELETE queries, weil Sie benötigen, um den index zu aktualisieren, nicht nur die Zeile.
Dies ist nur eine persönliche Meinung (ich habe keine Fakten um es wieder auf), aber ich denke, dass, wenn es eine Abfrage, die eine lange Zeit und ein index würde das beschleunigen - go for it! "Zu viele" indiziert werden würde, wenn Sie Indizes, die nicht tun, keine guten (z.B. gab es keine Abfragen beschleunigen würde). Zum Beispiel, eine dumme Sache zu tun wäre, um einen index für jede Spalte, die "einfach da".
Es gibt keine Magische Zahl für die "beste" Anzahl der Indizes. Die grundlegende Regel lautet: hinzufügen von Indizes für Abfragen, die Häufig verwendet werden und/oder müssen schnell laufen.
Dass Sie "zu viele" Indizes sollte nicht verlangsamen Abfragen, aber es jeden index Hinzugefügt, fügt eine kleine Menge von Zeit, um hinzufügen/update-Elemente in der db (da es ändert die Indizes auch), und eine kleine Menge von Raum. Allerdings, wenn Sie nur das hinzufügen von Indizes als erforderlich, dies ist wahrscheinlich nicht ein großes Anliegen.