Heim > Datenbank > MySQL-Tutorial > Hauptteil

Zusammenfassung der MySQL-Indizes – detaillierte Einführung in die MySQL-Indextypen und deren Erstellung

黄舟
Freigeben: 2017-03-04 15:04:20
Original
1308 Leute haben es durchsucht

Was die Vorteile von MySQL-Indizes betrifft: Wenn MySQL, das ordnungsgemäß entwickelt wurde und Indizes verwendet, ein Lamborghini ist, dann ist MySQL, das nicht entwickelt wurde und Indizes verwendet, ein menschliches Dreirad. Bei Tabellen ohne Indizes kann eine einzelne Tabellenabfrage Hunderttausende Daten umfassen, was den Engpass darstellt. Normalerweise können große Websites Hunderttausende oder sogar Millionen Daten an einem einzigen Tag generieren, und Abfragen ohne Indizes werden sehr langsam. Am Beispiel von WordPress fügen seine mehreren Datentabellen Indizes zu häufig abgefragten Feldern hinzu. Beispielsweise verfügt die Tabelle wp_comments über einen BTREE-Index, der für 5 Felder ausgelegt ist.

Ein einfacher Vergleichstest

Nehmen Sie die Daten, die ich letztes Jahr getestet habe, als einfaches Beispiel. Mehr als 20 Datenquellen haben zufällig 2 Millionen Daten generiert. Im Durchschnitt hat jede Datenquelle etwa 100.000 Zweitens ist die Tabellenstruktur relativ einfach und enthält nur eine automatisch inkrementierende ID, einen char-Typ, einen text-Typ und einen int-Typ. Die einzelne Tabelle ist 2G groß und verwendet die MyIASM-Engine. Starten des Tests ohne Hinzufügen von Indizes.

Führen Sie die folgende SQL-Anweisung aus:

mysql> SELECT id,FROM_UNIXTIME(time) FROM article WHERE a.title='测试标题'
Nach dem Login kopieren

Die für die Abfrage erforderliche Zeit ist sehr beängstigend. Wenn Sie gemeinsame Abfragen und andere Einschränkungen hinzufügen, geht die Datenbank verloren Verrückt. Verbraucht Speicher und beeinträchtigt die Ausführung von Front-End-Programmen. Fügen Sie zu diesem Zeitpunkt einen BTREE-Index zum Titelfeld hinzu:

mysql> ALTER TABLE article ADD INDEX index_article_title ON title(200);
Nach dem Login kopieren

Führen Sie die obige Abfrageanweisung erneut aus, und der Kontrast ist sehr offensichtlich:

Das Konzept des MySQL-Index

Indizes sind spezielle Dateien (die Indizes der InnoDB-Datentabelle sind Bestandteil des Tabellenbereichs). Sie enthalten Referenzzeiger auf alle Datensätze in der Datentabelle. Allgemeiner ausgedrückt ist ein Datenbankindex wie das Inhaltsverzeichnis am Anfang eines Buches, das Datenbankabfragen beschleunigen kann. Wenn in der obigen SQL-Anweisung kein Index vorhanden ist, durchläuft die Datenbank alle 200 Daten und wählt diejenigen aus, die die Bedingungen erfüllen. Mit dem entsprechenden Index sucht die Datenbank direkt nach den Optionen, die die Bedingungen im Index erfüllen . Wenn wir die SQL-Anweisung in „SELECT * FROM Article WHERE id=2000000“ ändern, möchten Sie, dass die Datenbank Ihnen die Ergebnisse nach dem Lesen von 2 Millionen Datenzeilen nacheinander liefert oder sie direkt im Index lokalisiert? Der klare Zeitvergleich zwischen den beiden Bildern oben gibt bereits die Antwort (Hinweis: Im Allgemeinen generieren Datenbanken standardmäßig Indizes für den Primärschlüssel).

Indizes werden in Clustered-Indizes und Nicht-Cluster-Indizes unterteilt. Cluster-Indizes werden nach dem physischen Speicherort der Daten geordnet. Nicht-Cluster-Indizes können jedoch die Geschwindigkeit des Zeilenabrufs verbessern. während der nicht gruppierte Index beim Abrufen einzelner Zeilen schnell ist.

Typen von MySQL-Indizes

Dies ist der einfachste Index. Der für das Titelfeld oben erstellte Index unterliegt keinen Einschränkungen Ein gewöhnlicher Index, der Standardindex vom Typ BTREE in MyIASM, ist auch der Index, den wir in den meisten Fällen verwenden.

2. Eindeutiger Index
01    –直接创建索引    
02    CREATE INDEX index_name ON table(column(length))    
03    –修改表结构的方式添加索引    
04    ALTER TABLE table_name ADD INDEX index_name ON (column(length))    
05    –创建表的时候同时创建索引    
06    CREATE TABLE `table` (    
07    `id` int(11) NOT NULL AUTO_INCREMENT ,    
08    `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,    
09    `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,    
10    `time` int(10) NULL DEFAULT NULL ,    
11    PRIMARY KEY (`id`),    
12    INDEX index_name (title(length))    
13    )    
14    –删除索引    
15    DROP INDEX index_name ON table
Nach dem Login kopieren


ähnelt einem normalen Index, außer dass der Wert der Indexspalte eindeutig sein muss, aber Nullwerte ​​sind zulässig (Beachten Sie, dass es sich vom Primärschlüssel unterscheidet). Wenn es sich um einen kombinierten Index handelt, muss die Kombination der Spaltenwerte eindeutig sein und die Erstellungsmethode ähnelt der eines normalen Index.

01    –创建唯一索引    
02    CREATE UNIQUE INDEX indexName ON table(column(length))    
03    –修改表结构    
04    ALTER TABLE table_name ADD UNIQUE indexName ON (column(length))    
05    –创建表的时候直接指定    
06    CREATE TABLE `table` (    
07    `id` int(11) NOT NULL AUTO_INCREMENT ,    
08    `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,    
09    `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,    
10    `time` int(10) NULL DEFAULT NULL ,    
11    PRIMARY KEY (`id`),    
12    UNIQUE indexName (title(length))    
13    );
Nach dem Login kopieren
3. Volltextindex (FULLTEXT)



MySQL unterstützt Volltextindex und Volltextsuche ab Version 3.23 .23, FULLTEXT-Index Nur für MyISAM-Tabellen verfügbar; sie können aus CHAR-, VARCHAR- oder TEXT-Spalten als Teil einer CREATE TABLE-Anweisung erstellt oder später mit ALTER TABLE oder CREATE INDEX hinzugefügt werden. ////Bei größeren Datensätzen ist die Eingabe Ihrer Daten in eine Tabelle ohne FULLTEXT-Index und die anschließende Erstellung des Index schneller als die Eingabe der Daten in einen vorhandenen FULLTEXT-Index. Bedenken Sie jedoch, dass die Erstellung von Volltextindizes bei Datentabellen mit großer Kapazität ein sehr zeitaufwändiger und speicherplatzintensiver Prozess ist.

01    –创建表的适合添加全文索引    
02    CREATE TABLE `table` (    
03    `id` int(11) NOT NULL AUTO_INCREMENT ,    
04    `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,    
05    `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,    
06    `time` int(10) NULL DEFAULT NULL ,    
07    PRIMARY KEY (`id`),    
08    FULLTEXT (content)    
09    );    
10    –修改表结构添加全文索引    
11    ALTER TABLE article ADD FULLTEXT index_content(content)    
12    –直接创建索引    
13    CREATE FULLTEXT INDEX index_content ON article(content)
Nach dem Login kopieren
4. Einspaltiger Index, mehrspaltiger Index



Der Abfrageeffekt mehrerer einspaltiger Indizes unterscheidet sich von das eines einzelnen mehrspaltigen Indexes, da MySQL beim Ausführen einer Abfrage nur einen Index verwenden kann und aus mehreren Indizes den restriktivsten Index auswählt.

5. Zusammengesetzter Index (Präfix ganz links)

Üblicherweise verwendete SQL-Abfrageanweisungen unterliegen im Allgemeinen mehr Einschränkungen. Um die Effizienz von MySQL weiter zu steigern, ist es notwendig, die Einrichtung eines zusammengesetzten Indexes in Betracht zu ziehen . In der obigen Tabelle wird beispielsweise ein kombinierter Index für Titel und Zeit erstellt: ALTER TABLE Article ADD INDEX index_titme_time (title(50), time(10)). Das Erstellen eines solchen kombinierten Index entspricht tatsächlich dem Erstellen der folgenden zwei Sätze kombinierter Indizes:

–Titel, Zeit

–Titel

Warum gibt es keinen kombinierten Index wie Zeit? ? Wolltuch? Dies ist auf das „ganz linke Präfix“ des MySQL-Verbundindex zurückzuführen. Das einfache Verständnis besteht darin, die Kombination nur ganz links zu beginnen. Nicht nur Abfragen, die diese beiden Spalten enthalten, verwenden den kombinierten Index, wie in den folgenden SQLs gezeigt:

Das Obige ist eine Zusammenfassung der MySQL-Indizes – eine detaillierte Einführung in die MySQL-Indextypen und die Erstellung von Inhalten, z Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!
1    –使用到上面的索引    
2    SELECT * FROM article WHREE title='测试' AND time=1234567890;    
3    SELECT * FROM article WHREE utitle='测试';    
4    –不使用上面的索引    
5    SELECT * FROM article WHREE time=1234567890;
Nach dem Login kopieren


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage