Mehrere Situationen, die dazu führen, dass MySQL einen vollständigen Tabellenscan durchführt

Mehrere Situationen, die dazu führen, dass MySQL einen vollständigen Tabellenscan durchführt

In den letzten zwei Tagen habe ich zwei SQL-Typen gesehen, die zu vollständigen Tabellenscans führen können. Hier sind zwei Beispiele, damit Sie sich diese Fehler nicht entgehen lassen:

Fall 1:

Bei einer erzwungenen Typkonvertierung wird der Index nicht verwendet und ein vollständiger Tabellenscan durchgeführt.

Hier sind einige Beispiele:

Zuerst erstellen wir eine Tabelle

 CREATE TABLE `test` (
  `id` int(11) NICHT NULL AUTO_INCREMENT,
  `Alter` int(11) DEFAULT NULL,
  `score` varchar(20) NICHT NULL STANDARD '',
  Primärschlüssel (`id`),
  SCHLÜSSEL `idx_score` (`Punktzahl`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8

Wir können sehen, dass diese Tabelle drei Felder hat, von denen zwei vom Typ int und eines vom Typ varchar sind. Das Feld „Score“ vom Typ Varchar ist ein Index und die ID ist der Primärschlüssel.

Dann fügen wir einige Daten in diese Tabelle ein. Die Tabelle sieht nach dem Einfügen der Daten wie folgt aus:

mysql:yeyztest 21:43:12>>Wählen Sie * aus Test;
+----+------+-------+
| ID | Alter | Punktzahl |
+----+------+-------+
| 1 | 1 | 5 |
| 2 | 2 | 10 |
| 5 | 5 | 25 |
| 8 | 8 | 40 |
| 9 | 2 | 45 |
| 10 | 5 | 50 |
| 11 | 8 | 55 |
+----+------+-------+
7 Zeilen im Satz (0,00 Sek.)

Zu diesem Zeitpunkt verwenden wir die EXPLAIN-Anweisung, um die Ausführung der beiden SQL-Anweisungen anzuzeigen:

Erläutern Sie „Select * from test where score ='10'“;

Erläutern Sie „Select * from test where score =10“;

Die Ergebnisse sind wie folgt:

mysql:yeyztest 21:42:29>>erklären Sie „select * from test where score ='10';“
+----+----------+----------+---------+------+---------------+-----------+-----------+-----------+---------+-------+---------+------+------+------+------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+----------+----------+---------+------+---------------+-----------+-----------+-----------+---------+-------+---------+------+------+------+------+
| 1 | EINFACH | Test | NULL | Ref | idx_score | idx_score | 62 | const | 1 | 100,00 | NULL |
+----+----------+----------+---------+------+---------------+-----------+-----------+-----------+---------+-------+---------+------+------+------+------+
1 Zeile im Satz, 1 Warnung (0,00 Sek.)

mysql:yeyztest 21:43:06>>erklären Sie „select * from test where score =10“;
  +----+----------+----------+---------+------+---------------+---------+---------+------+---------+------+---------+----------+----------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+----------+----------+---------+------+---------------+---------+---------+------+---------+------+---------+----------+----------+-------------+
| 1 | SIMPLE | test | NULL | ALL | idx_score | NULL | NULL | NULL | 7 | 14.29 | Verwenden von where |
+----+----------+----------+---------+------+---------------+---------+---------+------+---------+------+---------+----------+----------+
1 Zeile im Satz, 3 Warnungen (0,00 Sek.)

Es ist ersichtlich, dass bei Verwendung eines Werts vom Typ varchar die Anzahl der im Ergebnis gescannten Zeilen 1 beträgt, und dass bei Verwendung eines ganzzahligen Werts von 10 die Anzahl der gescannten Zeilen 7 beträgt. Dies beweist, dass der Index ungültig wird, wenn eine erzwungene Typkonvertierung auftritt.

Fall 2:

Rückwärtsabfragen können keine Indizes verwenden und führen zu einem vollständigen Tabellenscan.

Erstellen Sie eine Tabelle test1, deren Primärschlüssel score ist, und fügen Sie dann 6 Datensätze ein:

CREATE TABLE `test1` (
  `score` varchar(20) nicht null Standard '',
  PRIMÄRSCHLÜSSEL (`score`)
) ENGINE=InnoDB STANDARD-CHARSET=utf8

mysql:yeyztest 22:09:37>>Wählen Sie * aus Test1;
+----------+
| Punktzahl |
+----------+
| 111 |
| 222 |
| 333 |
| 444 |
| 555 |
| 666 |
+----------+
6 Zeilen im Satz (0,00 Sek.)

Wenn wir die umgekehrte Suche verwenden, wird der Index nicht verwendet. Sehen wir uns die folgenden beiden SQL-Anweisungen an:

Erläutern Sie „Select * from test1 where score='111'“;

Erläutern Sie „Select * from test1“, wobei „Score! = ‚111‘“ ist.
mysql:yeyztest 22:13:01>>erklären Sie „select * from test1 where score='111';“
+----+----------+----------+---------+-------+---------------+--------+---------+---------+----------+-------+----------+-------------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+----------+----------+---------+-------+---------------+--------+---------+---------+----------+-------+----------+-------------+
| 1 | SIMPLE | test1 | NULL | const | PRIMARY | PRIMARY | 62 | const | 1 | 100.00 | Index wird verwendet |
+----+----------+----------+---------+-------+---------------+--------+---------+---------+----------+-------+----------+-------------+
1 Zeile im Satz, 1 Warnung (0,00 Sek.)

mysql:yeyztest 22:13:08>>erklären Sie „select * from test1 where score!='111';“
+----+----------+----------+---------+-------+---------------+--------+---------+---------+------+------+----------+----------+-------------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+----------+----------+---------+-------+---------------+--------+---------+---------+------+------+----------+----------+-------------+
| 1 | SIMPLE | test1 | NULL | index | PRIMARY | PRIMARY | 62 | NULL | 6 | 100.00 | Verwenden von where; Verwenden von index |
+----+----------+----------+---------+-------+---------------+--------+---------+---------+------+------+----------+----------+-------------+
1 Zeile im Satz, 1 Warnung (0,00 Sek.)

Sie können es sehen, nutzen Sie es! = Bei Verwendung als Bedingung ist die Anzahl der gescannten Zeilen die Gesamtanzahl der Zeilen in der Tabelle. Wenn wir also den Index verwenden möchten, können wir nicht die umgekehrte Übereinstimmungsregel verwenden.

Fall 3:

Bestimmte Wertbedingungen können zu einem vollständigen Tabellenscan führen.

Zuerst erstellen wir eine Tabelle und fügen einige Daten ein:

CREATE TABLE `test4` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL,
  SCHLÜSSEL `idx_id` (`id`)
) ENGINE=InnoDB STANDARD-CHARSET=utf8
1 Zeile im Satz (0,00 Sek.)

[email protected]:yeyztest 22:23:44>>Wählen Sie * aus Test4;
+------+------+
| Ich würde | Name |
+------+------+
| 1 | aaa |
| 2 | bbb |
| 3 | ccc |
| 4 | jayz |
| NULL | yeyz |
+------+------+
5 Zeilen im Satz (0,00 Sek.)

Die Tabelle test4 enthält zwei Felder. Das Feld id ist ein Index und das Feld name ist vom Typ varchar. Schauen wir uns die Anzahl der gescannten Zeilen in den folgenden drei Anweisungen an:

Erläutern Sie „Select * from test4 where id=1“;

Erläutern Sie „select * from test4“, wobei die ID null ist.

Erläutern Sie „select * from test4“, wobei id=1 oder id null ist.
mysql:yeyztest 22:24:12>>erklären Sie „select * from test4“, wo die ID null ist;
+----+----------+----------+---------+------+---------------+--------+---------+---------+---------+-------+----------+----------+----------+---------------------------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+----------+----------+---------+------+---------------+--------+---------+---------+---------+-------+----------+----------+----------+---------------------------+
| 1 | SIMPLE | test4 | NULL | ref | idx_id | idx_id | 5 | const | 1 | 100.00 | Indexbedingung verwenden |
+----+----------+----------+---------+------+---------------+--------+---------+---------+---------+-------+----------+----------+----------+---------------------------+
1 Zeile im Satz, 1 Warnung (0,00 Sek.)

mysql:yeyztest 22:24:17>>erklären Sie „select * from test4 where id=1;“
                      +----+----------+----------+---------+------+---------------+--------+---------+---------+---------+-------+------+------+------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+----------+----------+---------+------+---------------+--------+---------+---------+---------+-------+------+------+------+
| 1 | EINFACH | test4 | NULL | ref | idx_id | idx_id | 5 | const | 1 | 100,00 | NULL |
+----+----------+----------+---------+------+---------------+--------+---------+---------+---------+-------+------+------+------+
1 Zeile im Satz, 1 Warnung (0,00 Sek.)

mysql:yeyztest 22:24:28>>erklären Sie „select * from test4“, wobei id=1 oder id null ist;
+----+----------+----------+---------+------+---------------+---------+---------+------+---------+------+---------+----------+----------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+----------+----------+---------+------+---------------+---------+---------+------+---------+------+---------+----------+----------+
| 1 | SIMPLE | test4 | NULL | ALL | idx_id | NULL | NULL | NULL | 5 | 40,00 | Verwenden von „where“ |
+----+----------+----------+---------+------+---------------+---------+---------+------+---------+------+---------+----------+----------+
1 Zeile im Satz, 1 Warnung (0,00 Sek.)

Es ist ersichtlich, dass die alleinige Verwendung von „id=1“ und „id is null“ nur zum Scannen einer Datensatzzeile führt, während die Verwendung von „oder“ zum Verbinden der beiden zum Scannen der gesamten Tabelle ohne Verwendung des Index führt.

Um es kurz zusammenzufassen:

1. Bei einer erzwungenen Typkonvertierung wird der Index nicht verwendet und der vollständige Tabellenscan wird durchgeführt

2. Bei der umgekehrten Abfrage können keine Indizes verwendet werden, da dies zu einem vollständigen Tabellenscan führen würde.

3. Einige Bedingungen oder Werte können zu einem vollständigen Tabellenscan führen.

Oben sind die Details mehrerer Situationen aufgeführt, die dazu führen, dass MySQL einen vollständigen Tabellenscan durchführt. Weitere Informationen zum vollständigen Tabellenscan von MySQL finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • So verbessern Sie die Geschwindigkeit des vollständigen Tabellenscans von InnoDB in MySQL erheblich
  • MySQL-Sortierung mittels Index-Scan
  • Index-Skip-Scan in MySQL 8.0
  • Detaillierte Beispiele für den vollständigen Tabellenscan und den Indexbaumscan in MySQL

<<:  Eine schnelle Lösung für das Problem der PC- und Mobilanpassung

>>:  CSS erkennt, dass die linke Seite der Webseitenspalte fixiert ist und passt die Position beim Scrollen nach unten automatisch an

Artikel empfehlen

Detaillierte Erklärung, wo die von Docker abgerufenen Bilder gespeichert werden

Die vom Docker abgerufenen Befehle werden standar...

MySQL 5.7.18 Green Edition Download- und Installations-Tutorial

Dieser Artikel beschreibt den detaillierten Vorga...

Centos6.9-Installation Mysql5.7.18 Schrittaufzeichnung

Installationsreihenfolge rpm -ivh mysql-community...

JSON (JavaScript Object Notation) in einem Artikel verstehen

Inhaltsverzeichnis JSON wird angezeigt JSON-Struk...

Installieren und Konfigurieren von MySQL unter Linux

System: Ubuntu 16.04LTS 1\Laden Sie mysql-5.7.18-...

Detailliertes Beispiel für die JSON-Analyse mit MySQL (5.6 und darunter)

MySQL (5.6 und darunter) analysiert JSON #json-An...

So löschen Sie den gesamten Inhalt eines Verzeichnisses mit Ansible

Studierende, die Ansible verwenden, wissen, dass ...

Detaillierte Erklärung des Übergangsattributs einer einfachen CSS-Animation

1. Verständnis der Übergangsattribute 1. Das Über...

CocosCreator Typescript macht Tetris-Spiel

Inhaltsverzeichnis 1. Einleitung 2. Mehrere wicht...

Sammlung von 25 Schriftarten, die in berühmten Website-Logos verwendet werden

In diesem Artikel sind die Schriftarten zusammeng...

Müssen Designer das Programmieren lernen?

Oftmals wird nach der Fertigstellung eines Webdes...