2010-12-26 11 views
3

Sagen wir, ich habe eine Tabelle mit etwa 1 Million Zeilen, wobei die erste Spalte ein Primärschlüssel ist.Lädt MYSQL die gesamte Tabelle jedes Mal in den Cache?

Wenn dann laufe ich folgendes:

SELECT * FROM table WHERE id='tomato117' LIMIT 1 

Hat der Tabelle ALL in den Cache gestellt bekommen (und damit die Abfrage verursacht als Zeilen mehr und mehr zu bremsen hinzugefügt bekommen) oder würde die Anzahl der Zeilen von Die Tabelle spielt keine Rolle, da die Abfrage den Primärschlüssel verwendet?

edit: (hinzugefügt Limit 1)

Antwort

1

nichts dergleichen.

Es wird nur die Zeile, die Sie ausgewählt haben, und vielleicht ein paar andere Blöcke abrufen. Sie bleiben im Cache, bis etwas sie herausdrückt.

Durch den Cache, ich beziehe mich auf den innodb Puffer-Pool, nicht Query-Cache, der wahrscheinlich sowieso ausgeschaltet sein sollte.

+0

Er hat nie angegeben, dass er die InnoDB-Engine verwendet – TehShrike

+0

Das Prinzip ist das gleiche für andere Motoren - sie behalten ihren eigenen Cache von Blöcken von der Scheibe (MyISAM stützt sich auf das Betriebssystem für MYD Dateien) und nur die Blöcke, die Sie berührt haben, werden eingelesen. – MarkR

1
SELECT * FROM table WHERE id = 'tomato117' LIMIT 1 

Wenn tomato117 gefunden wird, stoppt er die Suche, wenn Sie LIMIT nicht gesetzt haben 1 es bis Ende der Tabelle suchen. tomato117 kann der zweite sein, und es wird immer noch 1 000 000 Zeilen nach anderen Tomaten suchen117.

http://forge.mysql.com/wiki/Top10SQLPerformanceTips

Showing rows 0 - 0 (1 total, Query took 0.0159 sec) 
SELECT * 
FROM 'forum_posts' 
WHERE pid = 643154 
LIMIT 0 , 30 

Showing rows 0 - 0 (1 total, Query took 0.0003 sec) 
SELECT * 
FROM `forum_posts` 
WHERE pid = 643154 
LIMIT 1 

Tabelle ist ungefähr 1 GB, 000+ 600 Zeilen.

+0

'Ein PRIMARY KEY ist ein eindeutiger Index, in dem alle Schlüsselspalten als NOT NULL definiert werden müssen. – ajreal

+0

Aber wenn es ein Primärschlüssel ist, wird er dann weiter suchen? Ich dachte Primärschlüssel war einzigartig ... Entschuldigung, nur ein Anfänger. – David19801

+1

Das 'LIMIT 1' ist nur nützlich, wenn kein Index verfügbar ist. Wenn ein Index vorhanden ist, sollte er der Engine mitteilen, wie viele Zeilen mit der Abfrage übereinstimmen. – grahamparks

0

Wenn Sie das Wort EXPLAIN vor dem Wort SELECT hinzufügen, zeigt es Ihnen eine Tabelle mit einer Zusammenfassung der Anzahl der gelesenen Zeilen anstelle der normalen Ergebnisse.

Wenn Ihre Tabelle über einen Index für die Spalte id verfügt (einschließlich der Angabe als Primärschlüssel), kann die Engine direkt zur exakten Zeile (oder den Zeilen für einen nicht eindeutigen Index) springen und nur lesen die minimale Menge an Datum. Wenn kein Index vorhanden ist, muss die gesamte Tabelle gelesen werden.

+0

Also selbst wenn ich eine Tabelle mit 100.000.000 Zeilen mache und jede Zeile viel Text hat, sagen wir 2000 Bytes pro Zeile, dann wird es, solange ich einen Primärindex am Anfang habe, immer noch verdammt schnell sein? (wie in unter 1 Sekunde) – David19801

+0

^Hängt von Server aber in der Theorie, ja. –

4

Wenn die id als Primärschlüssel definiert ist, die nur einen Datensatz mit Wert tomato117, so ist Limit nicht sinnvoll.

Die Verwendung von SELECT * wird ausgelöst, dass mysql vom Datenträger gelesen wird, weil alle Spalten im Index gespeichert werden. (mysql kann nicht vom Index abrufen) In der Theorie wird sich dies auf die Leistung auswirken.

Ihr SQL stimmt jedoch mit dem Abfrage-Cache überein. Also speichert mysql das Ergebnis im Abfrage-Cache zur späteren Verwendung.

Wenn die Größe des Abfragecaches sehr groß ist, speichert mysql alle SQL-Ergebnisse im Abfragecache, bis der Speicher voll ist.

Dies ist mit Kosten verbunden, wenn es ein Update auf Ihrer Tabelle gibt, wird die Invalidierung von Abfragecaches für mysql schwieriger.

+0

Dies ist die richtige Antwort. –

+0

in Bezug auf Select *: Wenn EVERY Spalte kein Index ist, macht es das langsamer? in Bezug auf Update: Es gibt regelmäßige Updates (1 gelesen, 1 Update jedes Mal, wenn die Homepage geladen wird), können Sie bitte erklären, wie dies die Geschwindigkeit beeinflussen wird, wie es nicht klar ist. Wie wird es für mysql schwieriger? – David19801

+0

'Select *' etwas langsamer, da die Daten von der Festplatte abgerufen werden müssen. Und wenn regelmäßige Aktualisierungen erforderlich sind, hilft der Abfragecache nicht, da der Cache nach der Aktualisierung abläuft. – ajreal

Verwandte Themen