Einige Details zu MySQL-Indizes

Einige Details zu MySQL-Indizes

Vor ein paar Tagen stellte mir ein Kollege eine Frage zum MySQL-Index. Obwohl ich ihn ungefähr kenne, möchte ich ihn trotzdem ausprobieren. Ist es möglich, Indizes für Abfragen wie „ist null“ und „ist nicht null“ zu verwenden? Vielleicht heißt es in einigen Artikeln im Internet, dass Indizes nicht verwendet werden können, aber tatsächlich ist das nicht der Fall. Schauen wir uns ein kleines Experiment an

CREATE TABLE `null_index_t` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `null_key` varchar(255) DEFAULT NULL,
 `null_key1` varchar(255) DEFAULT NULL,
 `null_key2` varchar(255) DEFAULT NULL,
 Primärschlüssel (`id`),
 SCHLÜSSEL `idx_1` (`null_key`) MIT BTREE,
 SCHLÜSSEL `idx_2` (`null_key1`) MIT BTREE,
 SCHLÜSSEL `idx_3` (`null_key2`) MIT BTREE
)ENGINE=InnoDB STANDARD-CHARSET=utf8mb4;

Verwenden einer gespeicherten Prozedur zum Einfügen von Daten

Trennzeichen $ #Verwenden Sie ein Trennzeichen, um das Ende der gespeicherten Prozedur zu markieren. $ zeigt das Ende der gespeicherten Prozedur an. create procedure nullIndex1()
beginnen
deklariere i int;	
deklariere j int;	
setze i=1;
setze j=1;
während(i<=100) mache	
	während(j<=100) mache	
		WENN (i % 3 = 0) DANN
	   INSERT INTO null_index_t (`null_key`, `null_key1`, `null_key2`) VALUES (null, LEFT(MD5(RAND()), 8), LEFT(MD5(RAND()), 8));
  SONST WENN (i % 3 = 1) DANN
			 INSERT INTO null_index_t ( `null_key`, `null_key1`, `null_key2` ) VALUES (LEFT(MD5(RAND()), 8), NULL, LEFT(MD5(RAND()), 8));
	 ANDERS
			 INSERT INTO null_index_t ( `null_key`, `null_key1`, `null_key2` ) VALUES (LEFT(MD5(RAND()), 8), LEFT(MD5(RAND()), 8), NULL);
  ENDE, WENN;
		setze j=j+1;
	Ende während;
	setze i=i+1;
	setze j=1;	
Ende während;
Ende 
$
rufen Sie nullIndex1() auf;

Dann schauen Sie sich unsere is null Abfrage an

ERKLÄREN Sie, dass „select * from null_index_t“ ist, wobei „null_key“ null ist; 

Schauen wir uns ein anderes an

ERKLÄREN Sie, dass „select * from null_index_t“ ist, wobei „null_key“ nicht null ist;

Was können wir von hier aus sehen? Denken Sie darüber nach.

Aus dem Obigen können wir ersehen, dass is null indiziert werden sollte, es handelt sich also zumindest nicht um eine pauschale Regel. is not null scheint jedoch nicht zu funktionieren. Nehmen wir eine kleine Änderung vor und ändern die Daten in dieser Tabelle in 9100 null und die restlichen 900 haben Werte. Führen wir dann den folgenden Befehl aus:

Schauen wir uns dann die Ausführungsergebnisse an

ERKLÄREN Sie, dass „select * from null_index_t“ ist, wobei „null_key“ null ist;

ERKLÄREN Sie, dass „select * from null_index_t“ ist, wobei „null_key“ nicht null ist; 

Ist es anders? Hier möchte ich hinzufügen, dass das im Experiment verwendete MySQL 5.7 ist und die Konsistenz anderer Versionen nicht garantiert ist.
Tatsächlich ist zu erkennen, dass sich mit der Änderung der Datenmenge auch die Frage ändert, ob MySQL den Index verwendet. Das bedeutet weder, dass „ist not null“ definitiv verwendet wird, noch dass „ist not null“ definitiv nicht verwendet wird. Stattdessen trifft der Optimierer eine Vorhersage basierend auf den Abfragekosten. Diese Vorhersage reduziert die Abfragekosten so weit wie möglich, hauptsächlich einschließlich der Tabellenrückgabe, ist jedoch möglicherweise nicht ganz genau.

Oben finden Sie ausführliche Informationen zum MySQL-Index. Weitere Informationen zum MySQL-Index finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • So optimieren Sie MySQL-Indizes
  • Analyse der Gründe, warum der Index bei der Suche im MySql-Bereich nicht wirksam wird
  • So zeigen Sie MySql-Indizes an und optimieren sie
  • Die Prinzipien und Mängel der MySQL-Volltextindizierung
  • „Implizite Konvertierung“ von MySQL 5.6 führt zu Indexfehlern und ungenauen Daten
  • Index-Skip-Scan in MySQL 8.0
  • Welchen MySQL-Eindeutigen Index oder Normalen Index soll ich wählen?
  • So optimieren Sie die MySQL-Indexfunktion basierend auf dem Schlüsselwort „Explain“

<<:  Fragen und Antworten: Unterschiede zwischen XML und HTML

>>:  Detaillierte Erläuterung der Keep-Alive- und Unified-Routing-Verarbeitung von Vue3-Cache-Seiten

Artikel empfehlen

Der Unterschied zwischen MySQL-Datenbankhost 127.0.0.1 und localhost

Viele meiner Freunde haben möglicherweise ein Pro...

20 CSS-Codierungstipps für mehr Effizienz (sortiert)

In diesem Artikel möchten wir eine Sammlung von 2...

Tiefgreifendes Verständnis mathematischer Ausdrücke in CSS calc()

Der mathematische Ausdruck calc() ist eine Funkti...

Umfassende Analyse der Isolationsebenen in MySQL

Wenn die Datenbank gleichzeitig denselben Datenst...

So verwenden Sie Docker zum Bereitstellen eines Django-Technologie-Stack-Projekts

Mit der Popularität und Reife von Docker ist es a...

Die umfassendste Erklärung des Sperrmechanismus in MySQL

Inhaltsverzeichnis Vorwort Globale Sperre Vollstä...

Mybatis implementiert Details zum Abfangen und Ändern von SQL-Abfragen

Vorwort Eine der Funktionen eines Interceptors be...

Anleitung zum Zurücksetzen des MySQL/MariaDB-Root-Passworts

Vorwort Vergessene Passwörter sind ein Problem, d...