私はMySQL 5.6を使用しており、一部の非常に大きなテーブルではクエリのパフォーマンスに問題があります。具体的には、テーブル間の参照とin()条件の両方がある場合に、テーブルを適切にインデックスする方法がわかりません。外部キーと範囲を持つクエリのインデックスデザイン
簡易テーブルは以下の通りである(Cは小さなテーブルが約20行であるのに対し、AとBの両方が大きなテーブルで、すべてのテーブルであるのInnoDB)
(ID int型、日時を作成し、ヴァル・INT)
B(ID int型、A_ID INT、C_ID INT)
C(ID int型、ヴァル・INT)
は、問題のクエリは次のようになります。
Select a.id
from a
join b ON (a.id = b.a_id)
where a.created >= now() - interval 90 day
and a.val = 0
and b.c_id in (
SELECT id
from c
where val = 1)
私は(valを、作成、ID)としてのインデックスを作成しているし、素晴らしい作品(C_ID、A_ID)としてBに1があるとき " = '' c_idの条件(例えばc_id = 5)ですが、 'in()'条件では、Aのインデックスが使用されていない代わりにプライマリキーインデックスを使用しており、このクエリは永遠に。強制的に私のインデックスの使用はどちらか助けていないようです。
これをより良い方法で索引付けする方法や、このタイプのクエリのパフォーマンスを向上させる方法に関するヒントやアイデアはありますか?
非常に参考になりました。それはオプティマイザが同じページに常にではないようですが、どちらのインデックスを使用するかというと、これらの新しいインデックスではクエリがはるかに高速に実行されますが、明示的に使用する必要がありますか、 Aには年齢がかかる。 –