2010-11-25 21 views
0

tbで1ミル。行私は(私は、コンピュータを再起動した後 - それがキャッシュされていますので、何も)を行う場合:私は、「LOADキャッシュTB1 INTO INDEX」(key_buffer_sizeは= 128Mと総インデックスを実行した後
1. SELECT price,city,state FROM tb1 WHERE zipId=13458;
結果は0.270sどちらが高速で、key_cacheまたはOSキャッシュですか?

に23rowsありますTB用サイズ82Mです): 2. SELECT price,city,state FROM tb1 WHERE zipId=24781;
結果は0.252sで23rowsで、Key_readsは、私は再びクエリを実行する場合、私は、OSのキャッシュに 'zipId' をロードした後Key_read_requestsが23

BUTでインクリメントされ、一定のまま:
2. SELECT price,city,state FROM tb1 WHERE zipId=20548;
結果は22で0.006s

これは単なる例ですが、私は数十のテストと組み合わせを実行します。しかし、結果は常に同じです。
私は、MyISAM、WINDOWS 7 64、query_cacheのMySqlを使用しています。 zipId(プライマリキーではない)通常のインデックスです

SHIULD NOT key_cacheはOSキャッシュより高速ですか?
キャッシュにインデックスをロードした後、速度に大きな違いはないはずですか?
(私のテストではほとんど違いはありません)

私はこの問題に関して多くのウェブサイト、チュートリアル、ブログを読んだことがありますが、スピードの違いについては実際に話し合っていません。だから、どんなアイデアやリンクも大歓迎です。
ありがとうございます。

+0

テーブルデザインとは何ですか?使用されるインデックスが脂質、価格、都市、州をカバーしていない場合、キーキャッシュは高速になりません。その他の場合、クエリはインデックスを読み取り、次にテーブルを読み取ります。 –

+0

@Thomas Jones-Lowこのインデックスは、3列すべてをカバーしています。私はいくつかのテストをしましたが、1または3 colを選択すると大きな違いはありません。または選択された列がインデックスされている場合 – silversky

+0

@Thomas Jones-Lowまた、同じクエリを使用する理由は、OSのキャッシュ・ケースではずっと高速です。 (基本的に同じステップが含まれています) – silversky

答えて

0

通常のクエリ処理では、MySQLはwhere句の値(つまり、zipId = 13458)のインデックスをスキャンします。次に、インデックスを使用して、MyISAMメインテーブル(2番目のディスクアクセス)から対応する値を検索します。テーブルをメモリにロードすると、ディスクアクセスはすべて実際のディスクを読み取るのではなく、メモリ内で行われます。

クエリの遅い部分は、インデックスからメインテーブルへのルックアップです。したがって、索引をメモリーにロードしても、照会速度が向上するわけではありません。

インデックスの使用方法を確認するために、クエリにはExplain Selectを試してください。

編集:あなたのコメントへの回答がコメントスペースに収まるとは思わないので、私はここで答えます。

MyISAM自体にはキャッシュがありません。それは、ディスクキャッシングを行うためにOSに依存しています。どのくらいのテーブルがキャッシュされるかは、システム内で何が実行されているか、またどれだけのデータを読み込んでいるかによって異なります。特にWindowsでは、ユーザーがどのデータがキャッシュされ、どのくらいの期間にわたって制御されるのかは十分にはわかりません。

OSは、インデックスファイルまたはフルテーブルファイルのディスクブロック(4Kまたは8Kチャンク)をキャッシュします。あなたは、述語(WHERE句)上の関数を使用し、このような

SELECT indexed_col FROM tb1 WHERE zipId+0>1 

クエリは、MySQLは、むしろ任意のインデックスを使用するよりも全表スキャンを行うことがあります。私が上で示唆したように、EXPLAIN SELECTを使用してMySQLが何をしているかを見てください。

キャッシュをさらに制御したい場合は、INNODBテーブルを使用してみてください。InnoDB engineは、独自のキャッシュを作成してサイズを調整し、最も最近使用されたものを保持することができます。

+0

私は多くの研究とテストを行いましたが、現在の速度は0.000s未満です。しかし、私がよく理解していれば、私はまだ分かりません。このクエリでは、 'SELECT indexed_col FROM tb1 WHERE zipId + 0> 1'または' SELECT not_indexed_col FROM tb1 WHERE zipId + 0> 1'または 'SELECT zipId FROM tb1 IGNORE INDEX(zipId) 'キャッシュには何が入っていますか?その列だけ。または全体のtb? (それは私が使用する上記のクエリのいずれかの問題ではないので、使用した後、すべてのSELECTはすべてのテーブルのようにOSキャッシュにあります) – silversky

+0

また、私にヒントを与えることができます: OSキャッシュ内のテーブル私は上記の方法が最善の方法ではないと感じています。しばらくすると、クエリが遅くなるようです。私の説明は、それがOSのキャッシュからプッシュされたtbデータのいくつかであるということでした。私は正しい?それは普通ですか?どうすればこれを防ぐことができますか? – silversky

+0

システムには2GのRAMがあります。通常、タスクマネージャでチェックすると40-60%くらいです。十分なメモリであると思います。 – silversky

関連する問題