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:
|
<<: Eine schnelle Lösung für das Problem der PC- und Mobilanpassung
Die vom Docker abgerufenen Befehle werden standar...
Dieser Artikel beschreibt den detaillierten Vorga...
Umsetzungsprinzip Die Hauptgrafik besteht aus zwe...
Installationsreihenfolge rpm -ivh mysql-community...
Wenn die JSP angezeigt wird, zu der nach der Ausfü...
Verwenden Sie einen CSS-Filter, um den Mouseover-...
Inhaltsverzeichnis JSON wird angezeigt JSON-Struk...
System: Ubuntu 16.04LTS 1\Laden Sie mysql-5.7.18-...
MySQL (5.6 und darunter) analysiert JSON #json-An...
Studierende, die Ansible verwenden, wissen, dass ...
1. Verständnis der Übergangsattribute 1. Das Über...
Inhaltsverzeichnis 1. Einleitung 2. Mehrere wicht...
In diesem Artikel sind die Schriftarten zusammeng...
Vorwort Anwendungsszenario: Wahrscheinlich muss d...
Oftmals wird nach der Fertigstellung eines Webdes...