2012-04-06 7 views
9

ich mein Datenbank-Design unter Last zu testen und ich brauche nur eine feste Anzahl von Zeilen (5000)Abrufen nur eine feste Anzahl von Zeilen in MySQL

ich LIMIT dies zu erreichen angeben kann abgerufen werden, aber es scheint, dass die Abfrage die Ergebnismenge aller übereinstimmenden Zeilen erstellt und nur die Anzahl der im Limit angegebenen Zeilen zurückgibt. Ist es so implementiert?

Gibt es eine für MySQL, eine Zeile zu lesen, eine andere zu lesen und im Grunde zu stoppen, wenn sie die 5000. passende Zeile aufruft?

+0

Sie können LIMIT-Klausel verwenden, um eine Reihe von Zeilen auszuwählen. Ich verstehe nicht, was Ihre Verwirrung ist? – Teja

+0

Aus der Dokumentation, wenn ich richtig verstanden habe, gilt LIMIT nur, sobald die Ergebnismenge von der SELECT-Abfrage erstellt wurde. Die SELECT-Abfrage ruft also alle übereinstimmenden Zeilen aus einer Tabelle ab und ruft sie ab. Wenn alle übereinstimmenden Zeilen abgerufen wurden, wird nur die Anzahl der in der LIMIT-Klausel angegebenen Zeilen zurückgegeben. Ich habe mich gefragt, ob es eine Möglichkeit für die SELECT-Abfrage gab, nur die Anzahl der Zeilen abzurufen, die ich möchte. – Sandman

Antwort

16

MySQL ist schlau, wenn Sie in Ihrer Abfrage ein LIMIT 5000 angeben, und es ist möglich, dieses Ergebnis ohne das Generieren des gesamten Resultsets zuerst zu erzeugen, wird es nicht das gesamte Ergebnis erstellen.

Zum Beispiel die folgende Abfrage:

SELECT * FROM table ORDER BY column LIMIT 5000 

Diese Abfrage muss die ganze table scannen, es sei denn es einen Index auf column ist, in welchem ​​Fall es macht die intelligente Sache und verwendet den Index der finden Zeilen mit dem kleinsten column.

+0

Danke Keith.Nun, meine SELECT-Abfrage ist in etwa so: Wählen Sie SQL_NO_CACHE * aus readings_dev_1, in der Spalte zwischen "2012-03-30" und "2012-04-06". Ist die Abfrage intelligent genug, um nach 5000 Zeilen zu stoppen, wenn ich eine LIMIT-Klausel in die Abfrage einfügen soll? – Sandman

+0

Es wird sein, wenn Sie einen Index für 'reads_dev_1.column' haben. –

+0

Wenn ich bei dieser Select-Abfrage kein ORDER BY mache, brauche ich noch einen Index für diese Spalte? Ich verstehe die Notwendigkeit für einen Index für eine Spalte, wenn ich es anordne, so dass die Abfrage intelligent genug ist, nach 5000 Zeilen zu stoppen. In meinem Fall brauche ich jedoch keine ORDER für die zurückgegebenen Zeilen. Habe ich recht, wenn ich annehme, dass ich keinen Index für diese Spalte brauche und die Abfrage immer noch die schlaue Sache macht und nach 5000 Zeilen aufhört? – Sandman

5
SELECT * FROM `your_table` LIMIT 0, 5000 

Dies zeigt die ersten 5000 Ergebnisse aus der Datenbank an.

SELECT * FROM `your_table` LIMIT 1001, 5000 

Diese 1001,1002,1003 Aufzeichnungen zeigen ..... 6000

2

Komplexität einer solchen Abfrage ist O (LIMIT) (es sei denn, Sie Auftrag von angeben).

Wenn 10000000 Zeilen Ihrer Abfrage entsprechen und Sie einen Grenzwert von 5000 angeben, ist die Komplexität O (5000).

+0

Das ist eine prägnante Art, es zu sagen. Vielen Dank. Ich hatte den Eindruck, dass SELECT immer noch O (1000000) wäre, wenn ich so viele übereinstimmende Zeilen hätte, aber dann würde LIMIT die Größe der Ergebnismenge beschränken, die an mich zurückgegeben wird. Vielen Dank. – Sandman

0

Der genaue Plan, den der Abfrageoptimierer verwendet, hängt von Ihrer Abfrage (welche Felder ausgewählt sind, dem LIMIT-Betrag und ob ORDER BY gilt) und Ihrer Tabelle (Schlüssel, Indizes und Anzahl der Zeilen in der Tabelle) ab. Die Auswahl einer nicht indizierten Spalte und/oder die Sortierung durch eine Nicht-Schlüsselspalte führt zu einem anderen Ausführungsplan als die Auswahl einer Spalte und die Sortierung nach der Primärschlüsselspalte. Letzteres wird die Tabelle nicht einmal berühren und nur die Anzahl der in Ihrem LIMIT angegebenen Zeilen verarbeiten.

3

@ Jarosław Gomułka rechts ist
Wenn Sie LIMIT mit ORDER BY verwenden, MySQL endet die Sortierung, sobald sie die ersten row_count Reihen der sortierten Folge, anstatt das gesamte Ergebnis Sortierung gefunden hat. Wenn die Bestellung über einen Index erfolgt, ist das sehr schnell. In beiden Fällen muss nach dem Auffinden der ersten Zeilen kein Rest der Ergebnismenge sortiert werden, und MySQL tut dies nicht. Wenn die Menge nicht sortiert ist, wird die SELECT-Operation beendet, sobald genügend Zeilen zur Ergebnismenge vorhanden sind.

Verwandte Themen