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
In diesem Artikelbeispiel wird der spezifische Co...
Einführung Beginnen wir wie immer mit einer Szene...
Das Programm wird sequentiell von oben nach unten...
Zunächst einmal wissen wir, dass dieser Effekt ei...
Das Vergessen des Passworts ist ein Ärgernis. Was...
Diese Geschichte beginnt heute mit einer unerwarte...
Es handelt sich im Wesentlichen um ein allgemeine...
1. Was ist Als Auszeichnungssprache hat CSS eine ...
Was ist ein Selektor? Die Rolle des Selektors bes...
Inhaltsverzeichnis 1. Einführung in Label-Anweisu...
Linux-Taskverwaltung - Ausführung und Beendigung ...
1. Laden Sie das Installationspaket herunter -Wäh...
Screenshots der Effekte: Implementierungscode: Cod...
In diesem Artikel wird beschrieben, wie Sie mit D...
Inhaltsverzeichnis Vorwort 1. Was ist Selen? 2. N...