2017-04-18 3 views
0

私はこの質問に今日考えていた...Mysql - "SELECT field"は "SELECT *"としてメモリを埋めるのですか? - Innodb

私は、例えば、20フィールド、100Kの行を持つinnodbテーブルがある場合....どのようにメモリは、この2つの異なるクエリでいっぱいです:

1) SELECT field1, field2, field3 from table where field10 = '1'; 

2) Select * from table where field10 = '1'; 

どちらの場合も、メモリ全体がテーブル全体で満たされていますか? innodb_buffer_poolがいっぱいになったときに、どこで考慮に入れられますか?

答えて

2

field10が索引付けされている場合、InnoDBはその値を持つ行を見つけるために索引を読み取るだけです。次に、それらの行を含む表のページを読み取る必要があります。テーブル全体を読む必要はありません。

これはインデックスの利点です。

インデックスにfield1,field2,field3が含まれている場合、InnoDBはテーブルからページを読み飛ばすことができます。インデックスだけから必要な値を得ることができます。

ALTER TABLE `table` ADD KEY (field10, field1, field2, field3); 

電話帳で誰かの名前を検索し、そのアドレスを「余分な」フィールドとして見つけたときのようなものです。この本はその人の住所によってソートされていませんが、無料で入手できます。

インデックスから必要な列を取得したときに、インデックスをカバーするのはと呼ばれ、クエリはテーブルから行全体を読み取る必要はありません。

あなたは私のプレゼンテーションhttps://www.slideshare.net/billkarwin/how-to-design-indexes-really

+0

こんにちはビルを好むかもしれない、あなたのプレゼンテーションのためのthaks、それは非常に興味深いですし、私はそれをすべて読んでするつもりです! もう1つの好奇心がありますが、答えは更新クエリでも同じですか? たとえば、2GBのテーブルを持っていて、10行の更新を行うと、その10行がバッファにロードされます。 – Jung

+0

右。索引は、問合せが「検査済み行」を絞り込むのに役立ちます。検査された行はバッファー・プールにロードされるため、WHERE節のSQL条件を各行に適用することができます。 –

関連する問題