Ich habe eine sehr große MySQL-Tabelle mit ungefähr 150.000 Datenzeilen. Derzeit, wenn ich versuche und renne
SELECT * FROM table WHERE id = '1';
der Code funktioniert einwandfrei, da das ID-Feld der primäre Index ist. Für eine kürzliche 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, daher indiziert mysql das Feld jetzt, aber wenn ich versuche, die obige Abfrage auszuführen, wird sie sehr langsam ausgeführt. Eine EXPLAIN-Abfrage zeigt an, dass es keinen Index für das Feld product_id gibt, wenn ich bereits einen hinzugefügt habe. Infolgedessen benötigt die Abfrage 20 bis 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?
ALTER TABLE `table` ADD INDEX `product_id` (`product_id`)
Vergleichen Sie niemals integer
mit strings
in MySQL. Wenn id
int
ist, entfernen Sie die Anführungszeichen.
ALTER TABLE TABLE_NAME ADD INDEX (COLUMN_NAME);
Mit dieser Syntax können Sie einen Index hinzufügen und die Art des Index (HASH oder BTREE) steuern.
create index your_index_name on your_table_name(your_column_name) using HASH;
or
create index your_index_name on your_table_name(your_column_name) using BTREE;
Sie können sich hier über die Unterschiede zwischen BTREE- und HASH-Indizes informieren: http://dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html
Es ist erwähnenswert, dass mehrere Feldindizes die Abfrageleistung drastisch verbessern können. Im obigen Beispiel wird davon ausgegangen, dass ProductID das einzige Feld ist, in dem nachgeschlagen werden muss. Wenn jedoch die Abfrage ProductID = 1 AND Category = 7 lautet, hilft ein Index mit mehreren Spalten. Dies wird erreicht mit:
ALTER TABLE `table` ADD INDEX `index_name` (`col1`,`col2`)
Außerdem sollte der Index mit der Reihenfolge der Abfragefelder übereinstimmen. In meinem erweiterten Beispiel sollte der Index (ProductID, Category) sein und nicht umgekehrt.
Es können zwei Arten von Indizes hinzugefügt werden: Wenn Sie einen Primärschlüssel definieren, nimmt MySQL diesen standardmäßig als Index.
Erklärung
Primärschlüssel als Index
Angenommen, Sie haben eine tbl_student
-Tabelle und möchten student_id
als Primärschlüssel:
ALTER TABLE `tbl_student` ADD PRIMARY KEY (`student_id`)
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
ALTER TABLE `tbl_student` ADD INDEX student_index (`student_id`)
Die obige Anweisung erstellt einen normalen Index mit dem Namen student_index
.
eindeutigen Index erstellen
ALTER TABLE `tbl_student` ADD UNIQUE student_unique_index (`student_id`)
Hier ist student_unique_index
der Indexname, der student_id zugewiesen wird, und erstellt einen Index, für den Werte eindeutig sein müssen (hier kann null akzeptiert werden).
Volltextoption
ALTER TABLE `tbl_student` ADD FULLTEXT student_fulltext_index (`student_id`)
Die obige Anweisung erstellt den Volltextindexnamen mit student_fulltext_index
, für den Sie MyISAM Mysql Engine benötigen.
So entfernen Sie Indizes?
DROP INDEX `student_index` ON `tbl_student`
Wie überprüfe ich die verfügbaren Indizes?
SHOW INDEX FROM `tbl_student`
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, diesen nicht zu verwenden, kann dies folgende Ursachen haben:
ANALYZE TABLE
.Im Fall von (2) oder (3) könnten Sie MySQL überreden, den Index mit Indexhinweis sytax zu verwenden. Führen Sie in diesem Fall jedoch einige Tests durch, um festzustellen, ob die Leistung tatsächlich verbessert wird Verwenden Sie den Index so, wie Sie ihn andeuten.