Optimierung der Abfragegeschwindigkeit von MySQL mit mehreren zehn Millionen Daten mithilfe von Indizes

Optimierung der Abfragegeschwindigkeit von MySQL mit mehreren zehn Millionen Daten mithilfe von Indizes

1. Die Rolle des Index

Im Allgemeinen entspricht ein Index dem Inhaltsverzeichnis eines Buches. Wenn wir eine Abfrage basierend auf Bedingungen durchführen und kein Index vorhanden ist, müssen wir die gesamte Tabelle scannen. Das ist in Ordnung, wenn die Datenmenge klein ist, aber sobald die Datenmenge eine Million oder sogar mehrere zehn Millionen übersteigt, dauert die Ausführung einer SQL-Abfrage oft mehrere zehn Sekunden oder sogar länger. Mehr als 5 Sekunden sind bereits unerträglich.

Wenn das Problem durch Software gelöst werden kann, wird es durch Hardware nicht gelöst. Schließlich ist die Verbesserung des Hardwarecodes teuer und die Kosteneffizienz zu gering. Eine kostengünstige und effektive Lösung besteht darin, entsprechend Indizes hinzuzufügen. Die ordnungsgemäße Verwendung von Indizes kann die Abfragegeschwindigkeit um ein Tausendfaches erhöhen, was ein erstaunlicher Effekt ist.

(ii) MySQL-Indextypen:

Es gibt fünf Arten von MySQL-Indizes: Primärschlüsselindex, normaler Index, eindeutiger Index, Volltextindex und Clusterindex (mehrspaltiger Index).

Eindeutige Indizes und Volltextindizes werden selten verwendet. Wir konzentrieren uns hauptsächlich auf Primärschlüsselindizes, gemeinsame Indizes und Clusterindizes.

1) Primärschlüsselindex: Der Primärschlüsselindex ist ein Index, der dem Primärschlüssel hinzugefügt wird. Beim Festlegen des Primärschlüssels erstellt MySQL automatisch den Primärschlüsselindex.

2) Normaler Index: ein Index, der auf Grundlage von Spalten erstellt wird, die keine Primärschlüssel sind;

3) Clusterindex: Ein Index, der auf mehreren Spalten basiert.

(III) Indexsyntax:

Zeigen Sie den Index einer Tabelle an: Zeigen Sie den Index vom Tabellennamen an.

Erstellen Sie einen normalen Index: Tabelle ändern Tabellenname Index hinzufügen Indexname (Spalte zum Hinzufügen eines Index)

Erstellen Sie einen gruppierten Index: alter table table name add index index name (indizierte Spalte 1, indizierte Spalte 2)

Löschen Sie den Index einer Tabelle: Legen Sie den Index „Indexname“ auf dem Tabellennamen ab.

(IV) Leistungstests

Testumgebung: Arbeitsdesktop des Bloggers

Prozessor: Intel Core i5-4460 3,2 GHz;

Speicher 8G;

64-Bit-Windows.

1: Erstellen Sie eine Testtabelle

Tabelle löschen, wenn `Testbenutzer` vorhanden ist;
CREATE TABLE `test_user` (
 `id` bigint(20) PRIMARY-Schlüssel nicht null AUTO_INCREMENT,
 `Benutzername` varchar(11) DEFAULT NULL,
 `Geschlecht` varchar(2) DEFAULT NULL,
 `Passwort` varchar(100) DEFAULT NULL
)ENGINE=MyISAM STANDARD-CHARSET=utf8;

Die Speicher-Engine verwendet MyISAM, da diese Engine keine Transaktionen hat und eine sehr schnelle Einfügegeschwindigkeit aufweist, wodurch wir schnell zig Millionen Testdaten einfügen können. Nachdem wir die Daten eingefügt haben, ändern wir den Speichertyp in InnoDB.

2: Verwenden Sie gespeicherte Prozeduren, um 10 Millionen Datensätze einzufügen

Prozedur myproc() erstellen 
beginnen 
Deklariere num int; 
setze num=1; 
während num <= 10000000 
einfügen in test_user(Benutzername, Geschlecht, Passwort) Werte(Anzahl, „vertraulich“, PASSWORT(Anzahl)); 
setze num=num+1;
Ende während;
 Ende
rufe myproc() auf;

Aufgrund der verwendeten MyISAM-Engine dauerte das Einfügen von 10 Millionen Datensätzen nur 246 Sekunden. Bei der InnoDB-Engine würde es mehrere Stunden dauern.

Ändern Sie dann die Speicher-Engine zurück zu InnDB. Verwenden Sie den folgenden Befehl: alter table test_user engine=InnoDB; Die Ausführung dieses Befehls dauert etwa 5 Minuten. Bitte haben Sie Geduld.

Tipps: Dies ist ein Test. Ändern Sie die Speicher-Engine in der Produktionsumgebung nicht nach Belieben. Der Vorgang „Tabelle ändern“ sperrt die gesamte Tabelle. Verwenden Sie ihn mit Vorsicht. Zweitens: Die MyISAM-Engine hat keine Transaktionen und schreibt nur Daten in den Speicher und schreibt die Daten dann regelmäßig auf die Festplatte, sodass ein plötzlicher Stromausfall zu Datenverlust führt. Die InnDB-Engine schreibt Daten in Protokolle und überträgt sie dann regelmäßig auf die Festplatte, sodass Sie sich keine Sorgen über plötzliche Stromausfälle machen müssen. Wenn InnDB in der tatsächlichen Produktion verwendet werden kann, sollte es daher verwendet werden.

3: SQL-Test

Wählen Sie ID, Benutzername, Geschlecht und Passwort aus Testbenutzer, wobei ID = 999999

Dauer: 0,114 s.

Da wir beim Erstellen der Tabelle die ID als Primärschlüssel festgelegt haben, wurde beim Ausführen dieses SQL der Primärschlüsselindex verwendet, was die Abfragegeschwindigkeit so hoch machte.

Führen wir „select id,username,gender,password from test_user where username='9000000'“ aus.
Benötigte Zeit: 4,613 s.

Wir fügen der Spalte „Benutzername“ einen normalen Index hinzu.

ALTER TABLE `test_user` ADD INDEX index_name(Benutzername);

Dieser Vorgang dauert etwa 54,028 s. Beim Indexerstellungsprozess wird die gesamte Tabelle gescannt und die Indizes nacheinander erstellt, was natürlich langsam ist.

Führen Sie dann Folgendes aus: selectid,username,gender,password from test_user where username='9000000'
Dauer: 0,043 s.

Geben Sie anschließend Benutzername und Passwort ein, um an der Abfrage teilzunehmen.

Wählen Sie ID, Benutzername, Geschlecht und Passwort aus Testbenutzer, wobei Benutzername = „9000000“ und „Passwort“ = „*3A70E147E88D99888804E4D472410EFD9CD890AE“ ist.

Obwohl wir der Spalte „Benutzername“ einen Index hinzugefügt haben, ist die Spalte „Passwort“ nicht indiziert. Wenn der Index zum Filtern des Passworts verwendet wird, wird trotzdem die gesamte Tabelle gescannt.

Die Abfragegeschwindigkeit sank sofort.

Benötigte Zeit: 4,492 s.

Wenn unser SQL mehrere Spalten mit Filterbedingungen hat, müssen wir mehreren Spalten der Abfrage Indizes hinzufügen, um einen Gesamtindex zu bilden:

Fügen Sie einen gruppierten Index hinzu: ALTER TABLE `test_user` ADD INDEX index_union_name_password(username,password)
Führen Sie dann Folgendes aus:

Dauer: 0,001 s.

Wie eingangs erwähnt, besteht die Optimierung auf Softwareebene darin, Indizes sinnvoll hinzuzufügen und langsam ausgeführtes SQL zu optimieren. Die beiden ergänzen sich und sind unverzichtbar. Wenn die Abfrage nach dem Hinzufügen eines Index immer noch langsam ist, sollten Sie überlegen, ob es sich um ein SQL-Problem handelt, und SQL optimieren.

Tipps:

1: Auch wenn der Index hinzugefügt wurde, können die folgenden Situationen dennoch einen vollständigen Tabellenscan erfordern:

Die Indexspalte ist eine Zeichenfolge ohne Anführungszeichen;

Die Indexspalte erscheint nicht nach der Where-Bedingung;

Die Indexspalte erscheint nicht im Vordergrund.

2: Mögliche Situationen, in denen die zugehörige Abfrage den Index nicht verwendet, sind:

Die Zeichensätze der zugehörigen Tabellen sind unterschiedlich;

Die Zeichensätze der zugehörigen Felder sind unterschiedlich;

Die Speicher-Engine ist anders;

Die Längen der Felder sind unterschiedlich.

Dies ist das Ende dieses Artikels über die Optimierung der Abfragegeschwindigkeit von MySQL-Zehnmillionen von Daten basierend auf Indizes. Weitere relevante Inhalte zur MySQL-Indexoptimierungsabfrage finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Dieser Artikel zeigt Ihnen, wie Sie MySQL-Joins ohne Indizes optimieren
  • Detaillierte Erläuterung des MySQL-Indexprinzips und der Abfrageoptimierung
  • MySQL-Datenoptimierung - Mehrschichtiger Index
  • MySQL-Indexoptimierung: Detaillierte Einführung in die Paging-Erkundung
  • Detaillierte Erläuterung der MySQL-Indexauswahl und -Optimierung
  • MySQL-Leistungsoptimierungs-Index-Pushdown
  • MySQL-Optimierung und Indexanalyse

<<:  js Implementierung des Verifizierungscode-Falls

>>:  Detaillierte Erklärung mehrerer Möglichkeiten zum Erstellen eines oberen linken Dreiecks in CSS

Artikel empfehlen

Grafisches Tutorial zur Installation von MySQL 5.6.35 unter Windows 10 64-Bit

1. Laden Sie MySQL Community Server 5.6.35 herunt...

Sequenzimplementierungsmethode basierend auf MySQL

Das Team ersetzte den neuen Rahmen. Alle neuen Un...

Detaillierte Erklärung der Linux-RPM- und Yum-Befehle und -Verwendung

RPM-Paketverwaltung Ein Verpackungs- und Installa...

Lösung zum Verlassen von Lücken zwischen BootStrap-Rastern

Inhaltsverzeichnis [Siehe ein Beispiel]: [Der urs...

Grafisches Tutorial zur Installation und Konfiguration von mysql5.7.20 (Mac)

Grafisches Tutorial zur Installation und Konfigur...

So weisen Sie einer Instanz in Linux eine öffentliche IP-Adresse zu

beschreiben Beim Aufruf dieser Schnittstelle müss...

Detaillierte Erklärung zur Verwendung von ElementUI in Vue

Anmeldung + SessionStorage Effektanzeige Nach ein...

Mehrere Methoden zur Implementierung von Karussellbildern in JS

Karussell Die Grundidee ist: Im großen Container ...

Ein Leistungsfehler bei MySQL-Partitionstabellen

Inhaltsverzeichnis 2. Stapelanalyse mit pt-pmap 3...

Detaillierte Erklärung der Verwendung des MySQL-Paradigmas

1. Paradigma Der englische Name des Paradigmas la...

WeChat-Miniprogramme implementieren Sternebewertung

In diesem Artikel wird der spezifische Code für d...