Lassen Sie mich zunächst die MySQL-Version erklären: mysql> Version auswählen(); +-------------+ | version() | +-------------+ | 5.7.17 | +-------------+ 1 Zeile im Satz (0,00 Sek.) Tabellenstruktur: mysql> Beschreibungstest; +--------+---------------------+------+-----+---------+----------------+ | Feld | Typ | Null | Schlüssel | Standard | Extra | +--------+---------------------+------+-----+---------+----------------+ | id | bigint(20) unsigniert | NEIN | PRI | NULL | auto_increment | | val | int(10) unsigned | NEIN | MUL | 0 | | | Quelle | int(10) unsigniert | NEIN | | 0 | | +--------+---------------------+------+-----+---------+----------------+ 3 Zeilen im Satz (0,00 Sek.) „id“ ist der automatisch inkrementierte Primärschlüssel und „val“ ist ein nicht eindeutiger Index. Geben Sie eine große Menge an Daten ein, insgesamt 5 Millionen: mysql> wähle count(*) aus Test; +----------+ | Anzahl(*) | +----------+ |5242882| +----------+ 1 Reihe im Satz (4,25 Sek.) Wir wissen, dass Effizienzprobleme auftreten , wenn mysql> Auswahl * aus Test, wobei Wert = 4, Limit 300000,5; +---------+-----+--------+ | ID | Wert | Quelle | +---------+-----+--------+ | 3327622 | 4 | 4 | | 3327632 | 4 | 4 | | 3327642 | 4 | 4 | | 3327652 | 4 | 4 | | 3327662 | 4 | 4 | +---------+-----+--------+ 5 Reihen im Satz (15,98 Sek.) Um dasselbe Ziel zu erreichen, schreiben wir es normalerweise wie folgt um: mysql> wähle * aus Test, ein innerer Join (wähle ID aus Test, wo Wert=4, Limit 300000,5) b auf a.id=b.id; +---------+-----+--------+---------+ | ID | Wert | Quelle | ID | +---------+-----+--------+---------+ | 3327622 | 4 | 4 | 3327622 | | 3327632 | 4 | 4 | 3327632 | | 3327642 | 4 | 4 | 3327642 | | 3327652 | 4 | 4 | 3327652 | | 3327662 | 4 | 4 | 3327662 | +---------+-----+--------+---------+ 5 Reihen im Satz (0,38 Sek.) Der Zeitunterschied ist deutlich zu erkennen. Warum wird das obige Ergebnis angezeigt? Schauen wir uns den Abfragevorgang von Die Daten des Index-Blattknotens werden abgefragt. Ähnlich wie das folgende Bild: Wie oben gezeigt, müssen Sie den Indexknoten Jemand wird bestimmt fragen: Da der Index am Anfang verwendet wird, warum nicht zuerst entlang der Indexblattknoten bis zu den letzten 5 erforderlichen Knoten abfragen und dann die eigentlichen Daten im gruppierten Index abfragen. Hierzu sind nur 5 zufällige I/Os erforderlich, ähnlich dem Vorgang in der folgenden Abbildung: Bestätigt: Lassen Sie uns einige Operationen durchführen, um die obige Schlussfolgerung zu bestätigen: Um zu beweisen Ich kann das nur indirekt bestätigen: wähle * aus Test, wobei val=4 Grenze 300000,5 mysql> wähle index_name,count(*) aus information_schema.INNODB_BUFFER_PAGE, wobei INDEX_NAME in('val','primary') und TABLE_NAME wie '%test%' sind, gruppiere nach index_name; Leerer Satz (0,04 Sek.) Es ist ersichtlich, dass derzeit keine Datenseite zur Testtabelle im mysql> Auswahl * aus Test, wobei Wert = 4, Limit 300000,5; +---------+-----+--------+ | ID | Wert | Quelle | +---------+-----+--------+ | 3327622 | 4 | 4 | | 3327632 | 4 | 4 | | 3327642 | 4 | 4 | | 3327652 | 4 | 4 | | 3327662 | 4 | 4 | +---------+-----+--------+ 5 Reihen im Satz (26,19 Sek.) mysql> wähle index_name,count(*) aus information_schema.INNODB_BUFFER_PAGE, wobei INDEX_NAME in('val','primary') und TABLE_NAME wie '%test%' sind, gruppiere nach index_name; +------------+----------+ | Indexname | Anzahl(*) | +------------+----------+ | PRIMÄRE | 4098 | | Wert | 208 | +------------+----------+ 2 Reihen im Satz (0,04 Sek.) Es ist ersichtlich, dass sich zu diesem Zeitpunkt mysqladmin herunterfahren /usr/local/bin/mysqld_safe & mysql> wähle index_name,count(*) aus information_schema.INNODB_BUFFER_PAGE, wobei INDEX_NAME in('val','primary') und TABLE_NAME wie '%test%' sind, gruppiere nach index_name; Leerer Satz (0,03 Sek.) Führen Sie SQL aus: mysql> wähle * aus Test, ein innerer Join (wähle ID aus Test, wo Wert=4, Limit 300000,5) b auf a.id=b.id; +---------+-----+--------+---------+ | ID | Wert | Quelle | ID | +---------+-----+--------+---------+ | 3327622 | 4 | 4 | 3327622 | | 3327632 | 4 | 4 | 3327632 | | 3327642 | 4 | 4 | 3327642 | | 3327652 | 4 | 4 | 3327652 | | 3327662 | 4 | 4 | 3327662 | +---------+-----+--------+---------+ 5 Zeilen im Satz (0,09 Sek.) mysql> wähle index_name,count(*) aus information_schema.INNODB_BUFFER_PAGE, wobei INDEX_NAME in('val','primary') und TABLE_NAME wie '%test%' sind, gruppiere nach index_name; +------------+----------+ | Indexname | Anzahl(*) | +------------+----------+ | GRUNDSCHULE | 5 | | Wert | 390 | +------------+----------+ 2 Reihen im Satz (0,03 Sek.) Wir können den Unterschied zwischen den beiden deutlich erkennen: Das erste SQL lädt 4098 Datenseiten in Und dies führt zu einem Problem: Das Laden vieler nicht sehr heißer Datenseiten in Aufgetretene Probleme: Um sicherzustellen, dass Damit ist dieser Artikel darüber, warum die Verwendung von Limits in MySQL die Leistung beeinträchtigt, abgeschlossen. Weitere Informationen zu den Auswirkungen der Verwendung von Limits in MySQL auf die Leistung finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
<<: Zabbix benutzerdefinierte Überwachung Nginx Status Implementierungsprozess
>>: Zusammenfassung der Ereignisse, die Browser registrieren können
Inhaltsverzeichnis 1. Konzept 2. Umgebungsbeschre...
login.html-Teil: <!DOCTYPE html> <html l...
Drag & Drop ist eine gängige Funktion im Fron...
Das Implementierungsprinzip der Kettenprogrammier...
1. Die Rolle der Klammern 1.1 Eckige Klammern [ ]...
Ergebnisse erzielen Bauen Sie zunächst mit HTML e...
Die Datei /etc/network/interfaces wird in Linux z...
Im Laufe der Arbeit werden Sie auf viele Fälle im...
Warum müssen wir die Browserkompatibilität von CS...
Vorwort Nehmen Sie Element Plus als Beispiel, um ...
Der Zweck des Schreibens von Skripten besteht dar...
Detaillierte Beschreibung der Eigenschaften Der Z...
Da myeclipse2017 und idea2017 auf dem Computer in...
Rezension der vorherigen Folge: Gestern haben wir...
Beim Webdesign verwenden wir Pfeile oft als Dekor...