Zusammenfassung der Lösungen zur Optimierung von Paging-Abfragen

Zu viele Funktionen, Scan-Datensätze usw. wirken sich auf die Geschwindigkeit der Abfrage aus. Es ist sehr wichtig, wie die Abfragegeschwindigkeit der SQL-Anweisung verbessert werden kann. Hier sind einige Optimierungsmethoden für SQL-Abfragen.

1. Häufig verwendete Paging-Abfrage

(1) Nicht verwendeter Index

Bei Tabellen mit kleinen Datenmengen verwenden wir häufig (select * from table limit x,y)das Formular, um Paging-Abfragen abzuschließen. Z.B:

select * from areas limit 0,20; (第一页)
select * from areas limit 20,20;(第二页)
select * from areas limit 40,20;(第三页)

Die Abfrage auf diese Weise verwendet nicht den Index, sodass eine vollständige Tabellenabfrage durchgeführt wird. Wenn die Datenmenge groß ist, ist die Geschwindigkeit sehr langsam.

Fügen Sie hier eine Bildbeschreibung ein

(2) Index verwenden

Wenn der Index verwendet wird, wird die Anzahl der gescannten Datensätze erheblich reduziert. Verwenden Sie EXPLAIN unten, um die Abfrage anzuzeigen:

explain select * from areas order by id desc limit 300,20;

Fügen Sie hier eine Bildbeschreibung ein
Der order by idVerwendungszweck hier ist die Verwendung des Primärschlüsselindex in id, andernfalls wird unsere Abfrage zu einer vollständigen Tabellensuche. Die hier abgefragten Zeilen stellen die Anzahl der gescannten Datensätze dar, wenn wir abfragen. Wenn der Startpunkt des Grenzwerts 300 beträgt, beträgt die Anzahl der Datensätze 320. Wenn der Startpunkt 1000000 ist, beträgt die Anzahl der Abfragedatensätze 100020, was bedeutet, dass die Startpunkt wird immer später Je langsamer die Abfragegeschwindigkeit ist. Wenn der Startpunkt das Ende erreicht, entspricht dies einer vollständigen Tabellensuche, und der Index verliert zu diesem Zeitpunkt seine Bedeutung.

Diese Art von Indexabfragemethode wird häufig von uns verwendet, aber diese Art von Abfrage muss an die Tabelle zurückgegeben werden, dh es ist eine zweite Abfrage erforderlich. Um die Rückkehr zur Tabellenoperation so weit wie möglich zu vermeiden, müssen wir empfehlen die Verwendung einer verzögerten Zuordnung, um die Abfrage so weit wie möglich durchzuführen. Verwenden Sie einen Deckungsindex.

(3) Feldinterpretation in erklären:

1) id: Kennung

2) select_type: der Abfragetyp:

  • EINFACH: Einfache SELECT-Anweisung (ohne UNION-Operation oder Unterabfrageoperation)
  • PRIMARY: Das äußerste SELECT in der Abfrage (z. B. führen zwei Tabellen UNION aus oder es gibt Unterabfragen, die äußere Tabellenoperation ist PRIMARY und die innere Operation ist UNION).
  • SUBQUERY: Das erste SELECT in der Unterabfrage (wenn mehrere Unterabfragen vorhanden sind)
  • DERIVED: Driven SELECT-Unterabfrage (die Unterabfrage befindet sich in der FROM-Klausel)

3) Tabelle: Ergebnistabelle

4) Partitionen: Übereinstimmende Partitionen

5) Typ: der Verbindungstyp der Tabelle,

  • Abfrageleistung: system> const> eq_ref> ref> range> index> all
  • ALL: Beim vollständigen Tabellenscan durchläuft MySQL die gesamte Tabelle, um übereinstimmende Zeilen zu finden
  • index: Full Index Scan, der Unterschied zwischen index und ALL besteht darin, dass der Indextyp nur den Indexbaum durchläuft.Obwohl sowohl all als auch Index die gesamte Tabelle lesen, wird der Index aus dem Index und alles von der Festplatte gelesen
  • Bereich: Ruft nur Zeilen in einem bestimmten Bereich ab. Verwenden Sie einen Index, um Zeilen auszuwählen
  • ref: Gibt die Verbindungsübereinstimmungsbedingung der obigen Tabelle an, dh welche Spalten oder Konstanten verwendet werden, um den Wert in der Indexspalte zu finden

6) mögliche_Tasten: Kann den Index verwenden

7) Schlüssel: Der tatsächlich verwendete Index

8) key_len: Die Länge des Indexfeldes

9) ref: Spalten- und Indexvergleich

10) Zeilen: Die Anzahl der gescannten Zeilen

11) gefiltert: Der Prozentsatz der Zeilen, die nach Tabellenbedingungen gefiltert wurden

12) Extra: Beschreibung und Erläuterung der Implementierung

  • Verwenden von temporären Tabellen: Eine temporäre Tabelle wird zum Speichern von Zwischenergebnissen verwendet. MySQL verwendet temporäre Tabellen beim Sortieren von Abfrageergebnissen. Wird häufig zum Sortieren der Reihenfolge nach und Gruppieren von Abfragegruppen nach verwendet.
  • Index verwenden: Gibt an, dass bei der entsprechenden Auswahloperation ein Abdeckungsindex verwendet wird, um den Zugriff auf die Datenzeilen der Tabelle zu vermeiden, und die Effizienz ist gut.
  • Verwenden von where: Gibt an, wo die Filterung verwendet wird

Erklären Sie im Detail: https://blog.csdn.net/why15732625998/article/details/80388236

Zweitens: Optimierung der Paging-Abfrage

1 Maximale ID-Abfragemethode

select * from areas where id>2000 limit 20;

Fügen Sie hier eine Bildbeschreibung ein
Diese Testdaten haben insgesamt 3750 Daten, ID> 2000, dh die Anzahl der abgefragten Datensätze entspricht den Daten nach ID = 2000.

Hinweis: Die
maximale ID-Abfragemethode kann nur auf sich selbst inkrementierende Komponenten angewendet werden. Der von uuid generierte Primärschlüssel ist für diese Methode nicht geeignet.

2 zwischen und

select * from user where id between 2000 and 2010;

Fügen Sie hier eine Bildbeschreibung ein
Auf diese Weise auch Kann nur auf selbst inkrementierende Primärschlüssel angewendet werden, und die ID ist nicht fehlerhaftAndernfalls wird diese Methode nicht empfohlen. Bei Verwendung von ZWISCHEN UND können 11 Datensätze abgefragt werden. Hier ist zu beachten, dass ZWISCHEN UND die Randbedingungen auf beiden Seiten enthält.

3 limit id

select * from areas where id>(select id from areas limit 2000,1)
limit 20;

Fügen Sie hier eine Bildbeschreibung ein
Obwohl 3750 Datensatzzeilen auf diese Weise gescannt werden, hat id einen Primärschlüsselindex, da id der Primärschlüssel istDie Abfrage des Grenzbereichs für eine Primärschlüssel-ID ist also select * from areas limit 2000,20;viel schneller.

SUBQUERY: Unterabfragen sind in der Liste SELECT oder WHERE enthalten

4 Verzögerte Zuordnung

Abdeckungsindex: Der Sekundärindex von InnoDB speichert den Primärschlüsselwert der Zeile im Blattknoten, sodass der Sekundärprimärschlüssel die Abfrage abdecken kann, wodurch die Sekundärabfrage des Primärschlüsselindex vermieden werden kann. Die erforderlichen Datenspalten müssen nur aus dem Index abgerufen werden. Sie müssen nicht zur Tabelle zurückkehren, dh Sie müssen nicht zum Primärschlüsselindexbereich gehen, um die Datenzeile zu finden.

Verzögerte Assoziation : Um die Abfragefähigkeit der SQL-Anweisung so weit wie möglich zu verbessern, lassen Sie den Teil der SQL-Anweisung den Abdeckungsindex zum Abfragen verwenden.

Wir haben ein gemeinsames Index-Keyin für das Hilfsfeld erstellt.

select * from areas a join (select aid from areas 
limit 2000,20) b on a.aid = b.aid;

Fügen Sie hier eine Bildbeschreibung ein
In der ersten Phase der Abfrage haben wir den Abdeckungsindex verwendet select aid from areas limit 2000,20, um die Übereinstimmungshilfe in der Unterabfrage der from-Klausel zu finden. Gemäß diesen Hilfsmitteln werden dann alle Spaltenwerte in der äußeren Abfrageübereinstimmung erhalten. Obwohl Sie keinen Index verwenden können, um die gesamte Abfrage abzudecken, ist es besser, als überhaupt keine Indexabdeckung verwenden zu können.

Hinweis:

  • Die Grenzwert-ID in 4 verwendet ebenfalls den Abdeckungsindex. Wir empfehlen jedoch, verzögerte Zuordnungsverknüpfungen für Abfragen zu verwenden. Vermeiden Sie die Verwendung von Unterabfragen. Wenn mehr Felder vorhanden sind und die Länge des Typs länger ist, ist auch eine verzögerte Zuordnung vorteilhafter.
  • Wenn bei der Auswahl ein Abdeckungsindex verwendet wird, wird der Verwendungsindex in der Erläuterung im Extre angezeigt.
  • Je größer der ID-Wert ist, desto höher ist die Abfragepriorität.
  • Die in der FROM-Liste enthaltene Unterabfrage ist als DERIVED (abgeleitet) gekennzeichnet, devived2was auf die abgeleitete Flächentabelle verweist.

5-Punkte-Tabellenabfrage

MySQL empfiehlt, dass der Speicher einer Tabelle 500 W Daten nicht überschreitet. Die Abfrage 400 W beträgt weniger als 1 Sekunde für allgemeine Abfragen. Wenn sie schneller ist, wird empfohlen, einen separaten Tabellenspeicher zu verwenden, der in zwei Situationen unterteilt werden kann Die Untertabelle befindet sich in der vertikalen Untertabelle.

(1) Horizontale
Untertabelle Wenn die Originaldaten einer Tabelle 900-W-Daten enthalten,Es kann in drei Tabellen gespeichert werden, und jede Tabelle speichert 3 Millionen Daten, so dass der Druck beim Abfragen viel geringer istUnd der Wirkungsgrad ist sehr hoch. Die Frage ist also, wie dieses Niveau des Wasserzählers realisiert werden kann. Sie können beispielsweise mycatMiddleware wie diese verwenden. Alibaba Cloud bietet auch Datenbank-Sharding-Technologie. Natürlich können Sie die Tabelle auch selbst von Hand schreiben, aber wenn Sie die Tabelle selbst von Hand schreiben, müssen Sie auf die achten ID-Duplizierung und Definieren der aktuellen ID in dieser Tabelle. Der Algorithmus empfiehlt die Verwendung des Hash-Werts.

(2) Vertikale
Untertabelle Wenn der Datensatz 100 W hat, sollte die Abfragegeschwindigkeit normalerweise nicht zu langsam sein. Da diese Tabelle jedoch zu viele Felder enthält und viele Felder vom Typ Text vorhanden sind,Zu diesem Zeitpunkt können wir die Felder, die weniger Platz in einer Tabelle beanspruchen, und die Felder, die mehr Platz in einer anderen Tabelle beanspruchen, unterteilen, Die beiden Tabellen werden einzeln zugeordnet, sodass die Abfrage viel schneller erfolgt.

(3) Kalte und heiße Tabellen.
Kalte und heiße Tabellen sind ebenfalls eine Idee für Untertabellen. Wenn eine Bank beispielsweise Rechnungen abfragt, können Sie nur Daten aus den letzten Monaten abfragen. Die vorherigen Daten müssen an die Gegenüber der Abfrage historischer Rechnungen werden Bankabfragedaten verwendet. Entwurfsideen für heiße und kalte Tische.

Erstellen Sie zwei identische Tabellen. In einer Tabelle werden die Datensätze der letzten drei Monate gespeichert: Tabelle a und in der anderen Tabelle werden die Daten vor drei Monaten gespeichert: Tabelle b. Neue von Benutzern generierte Datensätze können in Tabelle a gespeichert werden.Sie können Tabelle a jeden Morgen regelmäßig scannen. Solange der Datensatz vor drei Monaten erstellt wurde, können wir den Datensatz in Tabelle b migrierenFür Benutzer sind sie sensibler, wenn sie Daten in den letzten drei Monaten abfragen, und sie fragen möglicherweise vor drei Monaten nicht viel nach Daten ab, sodass dieses Design völlig vernünftig ist.

6 Index

Das Hinzufügen eines Index kann die Abfrageeffizienz verbessern. Wenn die Paging-Abfrage Bedingungen enthält, können wir der Bedingung einen Index hinzufügen. Die Datenbank verwaltet eine entsprechende Indextabelle. Bei der Abfrage wird zuerst die Indextabelle abgefragt und die Datensätze direkt basierend auf abgefragt Die von der Indextabelle zurückgegebenen Datensätze. Tabelle reduziert auch die Anzahl der gescannten Zeilen. Es ist jedoch zu beachten, dass der Index möglicherweise nicht ausgelöst wird, solange die folgenden Punkte auftreten. Seien Sie also vorsichtig.

  • Die Abfragebedingung ist nicht null
  • Wie bei Anweisungen wie Schlüsselwörtern wie '% notebook' ist der Index ungültig und% kann nicht oben stehen.
  • Solange eine der Bedingungen vor und nach OR keinen Index hinzufügt, wird die gesamte Tabelle gescannt und der Index wird ungültig.
  • Zusammengesetzter Index: Wenn Sie einen zusammengesetzten Index verwenden, müssen Sie das erste Indexfeld einbringen, da sonst der zusammengesetzte Index nicht wirksam wird.
  • > 、< 、 <>。
  • Zeichenfolge ohne einfache Anführungszeichen

7 Cache

Das Zwischenspeichern der Abfrage führt zu Redis, sodass der Speicher direkt gelesen wird, ohne die Festplattendaten abzufragen.

Hinweis:
Der Schwerpunkt der Abfrageoptimierung liegt darauf, wie die kleinste Anzahl von Datensätzen gescannt, die Ergebnisse der Abfrage zurückgegeben und der Cache verwendet werden, um den Datenbankzugriff zu reduzieren. Dies behebt jedoch die Symptome und nicht die Grundursache. Nur durch Schreiben von schönen SQL-Dateien das Programm unbesiegbar sein.

Referenzblog: https://blog.csdn.net/qq_33220089/article/details/105012663

Ich denke du magst

Origin blog.csdn.net/glpghz/article/details/109562262
Empfohlen
Rangfolge