Ich habe eine sehr große MySQL-Tabelle mit ungefähr 150.000 Datenzeilen. Derzeit, wenn ich versuche zu laufen
SELECT * FROM table WHERE id = '1';
Der Code läuft einwandfrei, da das ID-Feld der Primärindex ist. Für eine aktuelle Entwicklung im Projekt muss ich die Datenbank jedoch nach einem anderen Feld durchsuchen. Zum Beispiel:
SELECT * FROM table WHERE product_id = '1';
Dieses Feld wurde zuvor nicht indiziert. Ich habe jedoch eine hinzugefügt, sodass mysql das Feld jetzt indiziert. Wenn ich jedoch versuche, die obige Abfrage auszuführen, wird sie sehr langsam ausgeführt. Eine EXPLAIN-Abfrage zeigt, dass es keinen Index für das Feld product_id gibt, wenn ich bereits einen hinzugefügt habe. Daher dauert die Abfrage zwischen 20 und 30 Minuten, um eine einzelne Zeile zurückzugeben.
Meine vollständigen EXPLAIN-Ergebnisse sind:
| id | select_type | table | type | possible_keys| key | key_len | ref | rows | Extra |
+----+-------------+-------+------+--------------+------+---------+------+-------+------------------+
| 1 | SIMPLE | table | ALL | NULL | NULL | NULL | NULL |157211 | Using where |
+----+-------------+-------+------+--------------+------+---------+------+-------+------------------+
Es kann hilfreich sein zu beachten, dass ich gerade einen Blick darauf geworfen habe und das ID-Feld als INT gespeichert ist, während das PRODUCT_ID-Feld als VARCHAR gespeichert ist. Könnte dies die Ursache des Problems sein?
quelle
EXPLAIN
Ergebnisse veröffentlichen? Sind Sie sicher, dass es keinen Index gibt? Oder ist der Index dort, aber MySQL entscheidet sich dafür, ihn nicht zu verwenden?Antworten:
Nie vergleichen
integer
zustrings
in MySQL. Wennid
jaint
, entfernen Sie die Anführungszeichen.quelle
SHOW INDEXES FROM YOURTABLE
dev.mysql.com/doc/refman/5.0/en/show-index.html , um zu überprüfen, ob die Indizes hinzugefügt wurdenquelle
ALTER TABLE tbl ADD INDEX (col)
stattALTER TABLE tbl ADD INDEX col (col)
, dann unter Verwendung vonALTER TABLE tbl ADD INDEX (col)
mehr als einmal wird das Hinzufügen Indizes genannt haltencol_2
,col_3
... jedes Mal. Während mitALTER TABLE tbl ADD INDEX col (col)
2. Mal geben wirdERROR 1061 (42000): Duplicate key name 'col'
.Mit dieser Syntax können Sie einen Index hinzufügen und die Art des Index (HASH oder BTREE) steuern.
Informationen zu Unterschieden zwischen BTREE- und HASH-Indizes finden Sie hier: http://dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html
quelle
Es ist erwähnenswert, dass mehrere Feldindizes Ihre Abfrageleistung drastisch verbessern können. Im obigen Beispiel nehmen wir an, dass ProductID das einzige zu suchende Feld ist. Wenn jedoch die Abfrage ProductID = 1 AND Category = 7 lautet, hilft ein mehrspaltiger Index. Dies wird mit folgendem erreicht:
Außerdem sollte der Index mit der Reihenfolge der Abfragefelder übereinstimmen. In meinem erweiterten Beispiel sollte der Index (ProductID, Category) nicht umgekehrt sein.
quelle
the index should match the order of the query fields
?Es können Indizes von zwei Typen hinzugefügt werden: Wenn Sie einen Primärschlüssel definieren, wird dieser von MySQL standardmäßig als Index verwendet.
Erläuterung
Primärschlüssel als Index
Angenommen, Sie haben eine
tbl_student
Tabelle und möchtenstudent_id
als Primärschlüssel:Die obige Anweisung fügt einen Primärschlüssel hinzu. Dies bedeutet, dass indizierte Werte eindeutig sein müssen und nicht NULL sein dürfen.
Geben Sie den Indexnamen an
Die obige Anweisung erstellt einen normalen Index mit
student_index
Namen.Erstellen Sie einen eindeutigen Index
Hier
student_unique_index
wird der Indexname student_id zugewiesen und ein Index erstellt, für den Werte eindeutig sein müssen (hier kann null akzeptiert werden).Volltextoption
Die obige Anweisung erstellt den Volltextindexnamen mit
student_fulltext_index
obige , für den Sie MyISAM Mysql Engine benötigen.Wie entferne ich Indizes?
Wie überprüfe ich verfügbare Indizes?
quelle
Sie sagen, Sie haben einen Index, die Erklärung sagt etwas anderes. Wenn Sie dies jedoch wirklich tun, gehen Sie wie folgt vor:
Wenn Sie einen Index für die Spalte haben und MySQL beschließt, ihn nicht zu verwenden, kann dies daran liegen, dass:
ANALYZE TABLE
hilft manchmal ein .Im Fall von (2) oder (3) könnten Sie MySQL dazu bringen, den Index nach Indexhinweis-Sytax zu verwenden . Wenn Sie dies jedoch tun, führen Sie einige Tests durch, um festzustellen, ob sich die Leistung tatsächlich verbessert, wenn Sie den Index so verwenden, wie Sie ihn andeuten .
quelle