Heim  >  Artikel  >  Datenbank  >  Über redundante und doppelte Indizes in MySQL

Über redundante und doppelte Indizes in MySQL

一个新手
一个新手Original
2017-10-17 10:15:231707Durchsuche

MySQL ermöglicht die Erstellung mehrerer Indizes für dieselbe Spalte. MySQL muss doppelte Indizes separat verwalten und der Optimierer muss sie bei der Optimierung von Abfragen auch einzeln berücksichtigen, was sich auf die Leistung auswirkt.

Doppelte Indizes beziehen sich auf denselben Typ von Indizes, die für dieselben Spalten in derselben Reihenfolge erstellt wurden. Auf diese Weise erstellte doppelte Indizes sollten vermieden und sofort nach der Entdeckung gelöscht werden. Es ist jedoch möglich, verschiedene Arten von Indizes für dieselben Spalten zu erstellen, um unterschiedliche Abfrageanforderungen zu erfüllen.


CREATE TABLE test(
  ID INT NOT NULL PRIMARY KEY,
  A INT NOT NULL,
  B INT NOT NULL,  UNIQUE(ID),  INDEX(ID),
) ENGINE=InnoDB;

Diese SQL erstellt 3 doppelte Indizes. Normalerweise gibt es keinen Grund dafür.

Es gibt einige Unterschiede zwischen redundanten Indizes und doppelten Indizes. Wenn Sie Index (a, b) und dann Index (a) erstellen, handelt es sich um einen redundanten Index, da dies nur der Präfixindex ist vorheriger Index, daher kann (a ,b) auch als (a) verwendet werden, aber (b,a) ist kein redundanter Index, ebenso wenig wie Index (b), da b nicht die Präfixspalte ganz links im Index (a, b) Darüber hinaus sind andere Arten von Indizes, die für dieselben Spalten erstellt wurden (z. B. Hash-Indizes und Volltext-Indizes), unabhängig von den abgedeckten Indexspalten keine redundanten Indizes für B-Tree-Indizes.

Redundante Indizes treten normalerweise auf, wenn der Tabelle neue Indizes hinzugefügt werden. Beispielsweise könnte man einen neuen Index (A,B) hinzufügen, anstatt einen späteren Index (A) zu erweitern. Eine andere Situation besteht darin, einen Index auf (A, ID) zu erweitern, wobei ID der Primärschlüssel ist. Bei InnoDB ist der Primärschlüssel bereits im Sekundärindex enthalten, sodass dies ebenfalls redundant ist.

In den meisten Fällen sind redundante Indizes nicht erforderlich. Sie sollten versuchen, vorhandene Indizes zu erweitern, anstatt neue Indizes zu erstellen. Manchmal erfordern jedoch Leistungsüberlegungen redundante Indizes, da diese zu groß werden. Auswirkungen auf die Leistung anderer Abfragen, die den Index verwenden. Beispiel: Wenn es einen Index für eine Integer-Spalte gibt und Sie jetzt eine sehr lange Varchar-Spalte hinzufügen müssen, um den Index zu erweitern, kann die Leistung stark sinken, insbesondere wenn es Abfragen gibt, die diesen Index als abdeckenden Index verwenden. oder dies ist eine Myisam-Tabelle. Und wenn es viele Bereichsabfragen gibt (aufgrund der Präfixkomprimierung von Myisam)

Beispielsweise gibt es eine Userinfo-Tabelle. Diese Tabelle enthält 1.000.000 Datensätze, etwa 20.000 Datensätze für jeden state_id-Wert. Es gibt einen Index für state_id, daher nennen wir das folgende SQL Q1


SELECT count(*) FROM userinfo WHERE state_id=5; --Q1

Die Ausführungsgeschwindigkeit der geänderten Abfrage beträgt etwa 115 Mal pro Sekunde (QPS)

Es gibt noch ein anderes SQL, wir nennen es Q2


SELECT state_id,city,address FROM userinfo WHERE state_id=5; --Q2

Der QPS dieser Abfrage beträgt 10. Der einfachste Weg, die Leistung dieses Index zu verbessern, ist Um den Index zu bekämpfen, ist (state_id,city,address), damit der Index die Abfrage abdecken kann:


ALERT TABLE userinfo ADD KEY state_id_2(state_id,city,address);

 (Hinweis: state_id hat bereits einen Index. Gemäß (im Vergleich zum vorherigen Konzept ist dies ein redundanter Index anstelle eines doppelten Index)

Wie finde ich einen redundanten Index und einen doppelten Index heraus?

1. Sie können einige der Versuche in Shlomi Noachs common_schema verwenden, um eine Reihe häufig verwendeter Speicher und Versuche zu finden, die auf dem Server installiert werden können.

2. Sie können den pt_duplicate-key-checker im Percona Toolkit verwenden, der die Tabellenstruktur analysiert, um redundante und doppelte Indizes zu finden.

Das obige ist der detaillierte Inhalt vonÜber redundante und doppelte Indizes in MySQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn