Heim  >  Artikel  >  Datenbank  >  Wussten Sie, dass MySQL Limit Leistungsprobleme hat?

Wussten Sie, dass MySQL Limit Leistungsprobleme hat?

步履不停
步履不停Original
2019-06-19 14:51:352432Durchsuche

Wussten Sie, dass MySQL Limit Leistungsprobleme hat?

Die Paging-Abfrage von MySQL wird normalerweise über limit implementiert.

Die grundlegende Verwendung von MySQL limit ist sehr einfach. limitEmpfängt 1 oder 2 ganzzahlige Parameter. Wenn es 2 Parameter gibt, gibt der erste den Offset der ersten zurückgegebenen Datensatzzeile an und der zweite gibt die maximale Anzahl der zurückgegebenen Datensatzzeilen an. Der Offset der ersten Datensatzzeile beträgt 0.

Aus Gründen der Kompatibilität mit PostgreSQL unterstützt limit auch limit # offset #.

Problem:

Bei kleinen Offsets ist es kein Problem, limit direkt zum Abfragen zu verwenden, aber je größer die Datenmenge, desto weiter Der Offset der limit-Anweisung wird größer und die Geschwindigkeit deutlich langsamer.

Optimierungsideen:

Vermeiden Sie das Scannen zu vieler Datensätze, wenn die Datenmenge groß ist

Lösung :

Unterabfrage-Paging-Methode oder JOIN-Paging-Methode.

Die Effizienz von JOIN-Paging und Unterabfrage-Paging ist grundsätzlich gleich, und der Zeitaufwand ist grundsätzlich gleich.

Hier ist ein Beispiel. Im Allgemeinen ist der Primärschlüssel von MySQL ein automatisch inkrementierender numerischer Typ. In diesem Fall kann die folgende Methode zur Optimierung verwendet werden.

Im Folgenden wird eine Tabelle mit 800.000 Daten in einer realen Produktionsumgebung als Beispiel verwendet, um die Abfragezeit vor und nach der Optimierung zu vergleichen:

 -- 传统limit,文件扫描 [SQL]SELECT * FROM tableName ORDER BY id LIMIT 500000,2; 受影响的行: 0 时间: 5.371s -- 子查询方式,索引扫描 [SQL] SELECT * FROM tableName WHERE id >= (SELECT id FROM tableName ORDER BY id LIMIT 500000 , 1) LIMIT 2; 受影响的行: 0 时间: 0.274s -- JOIN分页方式 [SQL] SELECT * FROM tableName AS t1 JOIN (SELECT id FROM tableName ORDER BY id desc LIMIT 500000, 1) AS t2 WHERE t1.id <= t2.id ORDER BY t1.id desc LIMIT 2; 受影响的行: 0 时间: 0.278s

Sie können sehen, dass sich die Leistung um verbessert hat knapp 20 % nach Optimierungszeiten.

Optimierungsprinzip:

Unterabfragen werden für den Index abgeschlossen, während normale Abfragen für die Datendatei abgeschlossen werden. Im Allgemeinen ist die Indexdatei größer als die Datendateien sind viel kleiner, so dass der Betrieb effizienter ist. Denn um alle Feldinhalte abzurufen, muss die erste Methode eine große Anzahl von Datenblöcken umfassen und diese abrufen, während die zweite Methode grundsätzlich direkt nach dem Indexfeld sucht, bevor der entsprechende Inhalt abgerufen wird , also Die Effizienz wird natürlich erheblich verbessert.

Daher besteht die Optimierung von limit nicht darin, limit direkt zu verwenden, sondern zuerst die ID des Offsets zu erhalten und dann direkt die Größe von limit zu verwenden, um die Daten zu erhalten.

Beim tatsächlichen Projektgebrauch können Sie eine Methode verwenden, die dem Strategiemodus ähnelt, um das Paging zu handhaben. Wenn beispielsweise 100 Daten pro Seite vorhanden sind und diese innerhalb von 100 Seiten liegen, verwenden Sie das einfachste Paging Wenn es größer als 100 ist, verwenden Sie die Unterabfrage-Paginierungsmethode.

Weitere technische Artikel zum Thema MySQL finden Sie in der Spalte MySQL-Tutorial.

Das obige ist der detaillierte Inhalt vonWussten Sie, dass MySQL Limit Leistungsprobleme hat?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn