以下に示すようなクエリがあります。
select count(test.id) from table1
inner join table2 on table1.id = table2.id
where (table2.email = 'test@gmail.com'
OR (table2.phone1 IS NOT NULL AND table2.phone1 in ('123456'))
OR (table2.phone2 IS NOT NULL AND table2.phone2 in ('1234456')))
AND table2.id <> 1234
AND table2.created_at >= '2015-10-10'
AND table2.status NOT IN ('test')
AND table2.is_test = 'No';
table2.email、table2.phone1、table2.phone2、table2.created_at にインデックスがあります。これらはすべて単一インデックスであり、複合インデックスではありません。私の知る限り、(table2.email、table2.phone1、table2.phone2) の複合インデックスは、条件が OR 条件であるため機能しません。(table2.id、table2.created_at、table2.status、table2.is_test) に複合インデックスを作成しましたが、説明クエリで同じ結果が得られました。説明クエリを以下に示します
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE table2 range PRIMARY, created_at 8 293 Using where
created_at,
email,
phone1,
phone2,
com_index
1 SIMPLE table1 eq_ref PRIMARY PRIMARY 4 id 1 Using index
ここで、com_index は私が作成した複合インデックスです。このクエリを高速化するためにインデックスを作成するにはどうすればよいですか。説明の結果から、クエリ用に選択されたキーは created_at のようです。テーブル 2 の複合インデックスを作成する方法はありますか? 私を助けてください。前もって感謝します。
編集:このクエリの生産について説明します:
+----+-------------+-------+--------+----------------------------------------------+---------+---------+----------------------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+----------------------------------------------+---------+---------+----------------------+--------+-------------+
| 1 | SIMPLE | l0_ | range | PRIMARY,created_at,email,day_phone,eve_phone | PRIMARY | 4 | NULL | 942156 | Using where |
| 1 | SIMPLE | m1_ | eq_ref | PRIMARY | PRIMARY | 4 | lead_platform.l0_.id | 1 | Using index |
+----+-------------+-------+--------+----------------------------------------------+---------+---------+----------------------+--------+-------------+