2016-07-29 7 views
0

私はMySQLの5.7.13のテーブルを持っていますが、それは3カラム(実際にそれ以上ですが、これらの3つは検索に使用されます)です - カラムはcompany_id、カラムはdepartment_id、カラムはstatusです。大きなmysqlテーブルのインデックスを正しく使用するには?

通常、従業員はこのように働き、システムに入り、彼らが働く会社を選び、部門を選ぶ(必須です)。その後、メニューに移り、ステータスを指定せずにテーブルからデータを取得することも、ステータスを指定することもできます。

したがって、mysqlインデックスのプレフィックス順のために複雑なインデックス(company_id、department_id、status)を使用するのは当然のようでした。彼らは常に会社や部門、時には状況別にフィルタリングするので、すべてがうまく見えました。

しかし、最近、新しい機能が追加されました。特別な従業員もいます。通常のユーザーとは異なり、部門のみではなく会社のみを選択します。したがって、そのクエリは会社とステータス別にフィルタリングされます。これは、インデックスが壊れていることを意味します。部門別ではなく、ステータス別ではなく企業別にフィルタリングされます。

この問題を回避する方法を教えてください。ここには2つの解決策があります。 1つはステータスが非常に制限されていることです。つまり、CREATE(1)、SENT(2)、ACCEPTED(3)、REJECTED(4)という値が基本的にあります。だから、私は、インデックス(のcompany_id、ステータス、DEPARTMENT_ID)を作成することができ、ユーザーが任意のステータスを選択していない場合、私はこのようなクエリ何かに追加することができます。そのため、効率的

AND status in (1,2,3,4) 

ウィル・インデックス・仕事?または、他の解決策は、(company_id、department_id、status)と(company_id、status、department_id)の両方を持つ2番目のインデックスを作成することですが、mysqlオプティマイザは正しいインデックスを選択しますか?私は確信していません、どちらの方が良いですか、彼らのいずれかが動作します。

+0

テーブルの行数はいくつですか? 1社の典型的な行数は何ですか?最大は何ですか? 'company + dept'のためのステータスは' status'ですか? –

答えて

0

私には分かりますが、これは正常に動作するはずです。オプティマイザは(x,y,z)コンポジットのインデックスを使用し、必要に応じてusing index; using whereを実行します。コンポジットの一番左の部分が既にxのようなwhere句の一部であると私が理解していると仮定しています。yがすでにインデックス用に使用されています。

さらに、IN句が巨大であり、単一の列インデックスについて言うと、INはすばやく満足されます。それについて私がここに書いた答えを参照してください:Index uses IN

もちろん、EXPLAIN Syntaxという名前のMySQLマニュアルページと、Using EXPLAIN to Write Better MySQL Queriesのようなものを見てください。

関連する問題