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

Java-Beispielcode zum Generieren von zufälligen Zeichen

Beispielcode: importiere java.util.Random; import...

js realisiert horizontale und vertikale Slider

Als ich kürzlich an einem Übungsprojekt arbeitete...

Gängige Reparaturmethoden für die Trennung der MySQL Master-Slave-Replikation

Inhaltsverzeichnis 01 Problembeschreibung 02 Lösu...

So fragen Sie den minimal verfügbaren ID-Wert in der MySQL-Tabelle ab

Als ich mir heute die Laborprojekte ansah, stieß ...

MySQL-Unterabfrage und Details zur Verknüpfungstabelle

Inhaltsverzeichnis 1. Was ist eine Unterabfrage? ...

Grundlegende Konzepte und allgemeine Methoden des Map-Mappings in ECMAScript6

Inhaltsverzeichnis Was ist eine Zuordnung? Unters...

Wie die MySQL Select-Anweisung ausgeführt wird

Wie wird die MySQL-Select-Anweisung ausgeführt? I...

Detaillierte Erläuterung des Zahlungsfunktionscodes des Vue-Projekts

1. Alipay-Methode: Alipay-Methode: Klicken Sie zu...

Nodejs-Plugin und Nutzungsübersicht

Die Betriebsumgebung dieses Tutorials: Windows 7-...

So verwenden Sie den VIM-Editor unter Linux

Als leistungsstarker Editor mit umfangreichen Opt...

Beispielcode zum Zeichnen von Doppelpfeilen in gängigen CSS-Stilen

1. Mehrere Aufrufe eines einzelnen Pfeils Sobald ...