私は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オプティマイザは正しいインデックスを選択しますか?私は確信していません、どちらの方が良いですか、彼らのいずれかが動作します。
テーブルの行数はいくつですか? 1社の典型的な行数は何ですか?最大は何ですか? 'company + dept'のためのステータスは' status'ですか? –