2016-11-02 1 views
1

トラフィックの多いWebサイト用にmysqlテーブルを最適化しています。私はmysqlインデックスについて質問しています。最初にいくつかの情報:MySQLは最高のパフォーマンスを指します

テーブルには273382行があります。

クエリは次のとおりです。私は、次のインデックス持っ

SELECT table1.field1, table1.field2, table2.field2 
FROM table1 
LEFT JOIN table2 ON table1.idfield = table2.idfield 
WHERE table1.field = 1 AND table1.field2 = 'yes' 
ORDER BY table1.id DESC 
LIMIT 0,25 

:上記の指標のクエリで

index for table1.id - primary unique index 
index for table1.idfield - index 
index for table2.idfield - index 
index for (table1.field,table1.field2) - index 

を完了するために、1.5 2.5SにかかるEXTENDED EXPLAINそれを言います主キー(table1.id)を使用していますが、(このインデックスを使用していても)同様の結果を持つ一意の/ index(table1.field、table1.field2、table1.id)を試しました。

インデックス変更プロセス(約1分かかる)中に、クエリははるかに高速になります0.009。変更プロセスが完了すると、クエリは1.5-2.5秒(主に2未満)で遅くなることに戻ります。

私の質問は:どのインデックスがこのクエリに最適で、インデックスが変更されているのはなぜですか?

+0

一般的な経験則:決定コンテキスト( 'where'、' join'など)に使用されるフィールドは、その上にインデックスを持つ必要があります。インデックスだけを持っていても、それが常に使用されるというわけではありません。 mysqlは、インデックスを使用するよりも、完全なテーブルスキャンが効率的であると判断することがあります。 –

+0

私はそれを認識しています、そして私は結合のインデックスとどこのフィールドが、クエリがまだかなり遅いです。しかし、変更プロセス中、クエリははるかに高速に実行されます、なぜですか?このクエリは、変更されているときと同じくらい速く実行されるようにするにはどうすればよいですか。 –

+0

indexにtable1.fieldとtable1.field2の両方の列を追加してみてください。あなたのパフォーマンスに役立つかもしれません。 – reza

答えて

1

テーブルの約20%以上がtable1.field = 1 AND table1.field2 = 'yes'の場合、オプティマイザは最適インデックス(field, field2, id)とデータの間で前後にバウンスするのではなく、テーブルをスキャンする方が安価であると判断します。

これ以上説明したい場合は、SHOW CREATE TABLESHOW TABLE STATUSEXPLAIN SELECT ...、RAMのサイズ、およびinnodb_buffer_pool_sizeの値を入力してください。

キャッシュやI/Oの問題のような臭いがあります。上記の情報は、それを掘り下げるのに役立ちます。

関連する問題