2010-11-25 11 views
0

In einem TB mit 1 mil. wenn ich Zeilen tun (nachdem ich den Computer neu starten - so nichts es zwischengespeichert):
1. SELECT price,city,state FROM tb1 WHERE zipId=13458;
das Ergebnis ist 23rows in 0.270sWas ist schneller, key_cache oder OS-Cache?

nachdem ich 'LOAD INDEX INTO CACHE tb1' (key_buffer_size = 128M und insgesamt laufen Index Größe für tb ist 82M): 2. SELECT price,city,state FROM tb1 WHERE zipId=24781;
das Ergebnis ist 23rows in 0.252s bleibt Key_reads konstant, wird Key_read_requests mit 23 erhöht

BUT nachdem ich 'zipId' in OS-Cache laden, wenn ich wieder die Abfrage ausführen:
2. SELECT price,city,state FROM tb1 WHERE zipId=20548;
Das Ergebnis ist 22 Zeilen in 0,006s

Dies ist nur ein einfaches Beispiel, aber ich habe Dutzende von Tests und Kombinationen. Aber die Ergebnisse sind immer gleich.
Ich verwende: MySql mit MyISAM, WINDOWS 7 64, und der query_cache ist 0; zipId es ist ein regulärer Index (nicht Primärschlüssel)

SOLLTE key_cache nicht schneller sein als OS-Cache ??
SOLLTE NICHT ein großer Geschwindigkeitsunterschied sein, nachdem ich den Index in den Cache geladen habe ??
(in meinem Test ist es fast kein Unterschied).

Ich habe eine Menge Websites, Tutorials und Blogs zu diesem Thema gelesen, aber keine von ihnen diskutiert wirklich den Unterschied in der Geschwindigkeit. Also, alle Ideen oder Links werden sehr geschätzt.
Vielen Dank.

+0

Was ist das Tischdesign? Der Schlüssel-Cache wird nicht schnell sein, wenn der verwendete Index nicht den Sipid, den Preis, die Stadt und den Staat abdeckt. Otherwize die Abfrage liest den Index, dann die Tabelle. –

+0

@Thomas Jones-Low Der Index deckt alle 3 Col. Ich habe einige Tests gemacht und es ist kein signifikanter Unterschied, wenn ich 1 oder 3 Farben auswähle. ODER wenn die ausgewählten Spalten indiziert sind oder nicht – silversky

+0

@Thomas Jones-Low Und auch warum die gleiche Abfrage ist es viel, viel .. schneller auf OS-Cache-Fall? (Grundsätzlich sind die gleichen Schritte beteiligt) – silversky

Antwort

0

Unter normalen Abfrageverarbeitung wird MySQL den Index nach den Werten der Where-Klausel durchsuchen (d. H. ZipId = 13458). Dann verwendet der Index die entsprechenden Werte aus der MyISAM-Haupttabelle (ein zweiter Festplattenzugriff). Wenn Sie die Tabelle in den Arbeitsspeicher laden, werden die Festplattenzugriffe vollständig im Speicher ausgeführt, nicht vom Lesen einer echten Festplatte.

Der langsame Teil der Abfrage ist das Nachschlagen aus dem Index in die Haupttabelle. Wenn Sie also den Index in den Speicher laden, verbessert sich die Abfragegeschwindigkeit möglicherweise nicht.

Eine Sache zu versuchen ist Explain Select auf Ihre Abfragen zu sehen, wie der Index verwendet wird.

Bearbeiten: Da ich glaube nicht, dass die Antworten auf Ihre Kommentare in einen Kommentar Platz passen. Ich beantworte sie hier.

MyISAM hat an und für sich keinen Cache. Es beruht auf dem Betriebssystem, das Disk-Caching durchzuführen. Wie viel von Ihrer Tabelle zwischengespeichert wird, hängt davon ab, was Sie sonst noch im System ausführen und wie viele Daten Sie gerade lesen. Insbesondere lässt Windows dem Benutzer nicht viel Kontrolle darüber, welche Daten zwischengespeichert werden und für wie lange.

Das Betriebssystem speichert Festplattenblöcke (entweder 4K- oder 8K-Blöcke) der Indexdatei oder der vollständigen Tabellendatei.

SELECT indexed_col FROM tb1 WHERE zipId+0>1 

Abfragen wie diese, wo Sie Funktionen auf dem Prädikat verwenden (Where-Klausel) kann MySQL verursacht eher vollständigen Tabellenscans zu tun, als jeden Index. Wie oben erwähnt, verwenden Sie EXPLAIN SELECT, um zu sehen, was MySQL tut.

Wenn Sie mehr Kontrolle über den Cache wünschen, versuchen Sie es mit einer INNODB-Tabelle.Die InnoDB engine erstellt einen eigenen Cache, den Sie größenmäßig anpassen können, und macht die zuletzt verwendeten Daten besser.

+0

Ich habe eine Menge Forschung und Tests gemacht, und jetzt ist die Geschwindigkeit unter 0,000s. Aber eine Sache bin ich noch nicht sicher, ob ich gut verstanden habe: auf dieser Frage: 'SELECT indexed_col VON tb1 WHERE zipId + 0> 1' oder sogar' SELECT not_indexed_col VON tb1 WHERE zipId + 0> 1' oder 'SELECT zipId FROM tb1 IGNORE INDEX (zipId) 'WAS IST CACHED? nur das col. oder das ganze tb? (da es egal ist, welche der obigen Abfragen ich benutze, ABER nachdem ich es benutzt habe, verhält sich jedes SELECT wie alle Tabellen im OS Cache) – silversky

+0

Vielleicht könntest du mir auch einen Hinweis geben: WAS ist der beste Weg den zu laden Tabelle im Betriebssystem-Cache? Ich habe das Gefühl, dass die oben genannten Methoden nicht die besten sind. UND auch nach einer Weile scheint es, dass die Abfragen langsamer sind. Meine Erklärung war, dass einige der TB-Daten aus dem OS-Cache herausgeschoben wurden. Habe ich recht? Es ist normal? Wie kann ich das verhindern? – silversky

+0

das System hat 2G RAM und wenn ich es auf Task-Manager überprüfen, ist es in der Regel 40-60%, also denke ich, es sollte genug Speicher sein. – silversky

Verwandte Themen