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

Detaillierte Einführung und Verwendungsbeispiele für Map-Tag-Parameter

Karten-Tags müssen paarweise vorkommen, d. h. <...

Detaillierte Erklärung der Standardwerte von Breite und Höhe in CSS: auto und %

abschließend % der Breite: definiert die prozentu...

Vue implementiert das Hinzufügen, Anzeigen und Löschen mehrerer Bilder

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

Schritte eines hervorragenden Registrierungsprozesses

Für eine Website ist dies die grundlegendste Funkt...

Das ganz links stehende Übereinstimmungsprinzip des MySQL-Datenbankindex

Inhaltsverzeichnis 1. Gemeinsame Indexbeschreibun...

So starten und starten Sie nginx unter Linux neu

Nginx (Engine x) ist ein leistungsstarker HTTP- u...

So erstellen Sie Komponenten in React

Inhaltsverzeichnis Vorwort Komponenteneinführung ...

So fragen Sie einen Datensatz in MySQL ab, auf welcher Seite der Paging-Seite

Vorwort In der Praxis kann es zu folgendem Proble...

Verwenden Sie nginx + sekundären Domänennamen + https-Unterstützung

Schritt 1: Fügen Sie dem primären Domänennamen vo...

Lösung für die leere Seite nach einem vue.js-gepackten Projekt

Ich glaube, dass viele Partner, die gerade erst m...

So erstellen Sie einen SSH-Dienst basierend auf einem Golang-Image in Docker

Nachfolgend finden Sie den Code zum Erstellen ein...

Auswahl der MySQL-Tabellentyp-Speicher-Engine

Inhaltsverzeichnis 1. Zeigen Sie die Speicher-Eng...

So löschen Sie den Timer elegant in Vue

Inhaltsverzeichnis Vorwort Optimierung Ableitungs...