2017-06-23 18 views
0

私は次のmysqlクエリを最適化しようとしています。それは約2.5秒で実行されます。私は複合インデックスについて読んだことがありますが、複数の結合を含むこれらのようなクエリで複合インデックスをどのようにORDERするのかを誰かが理解できるように助けてくれることを願っています。計算された値。私は有用な複合指標を見逃していますか?これらのテーブルからデータを引き出すより効率的な方法がありますか?どんな助けもありがとうございます!ここで複合インデックスMySQLクエリを注文

SELECT 
branch.name AS branch, 
SUM(appointment.status = 'completed') AS `Completed`, 
SUM(appointment.status = 'cancelled') AS `Cancelled`, 
SUM(appointment.status = 'not completed') AS `Not Completed`, 
SUM(appointment.status != 'rescheduled') AS `Total` 
FROM rep 
JOIN customer ON rep.id = customer.rep_id 
JOIN office ON rep.office_id = office.id 
JOIN appointment ON customer.id = appointment.customer_id 
JOIN branch ON office.branch_id = branch.id 
WHERE rep.active= 1 
AND rep.group IN (1,2,3) 
AND rep.deleted = 0 
AND customer.saved = 0 
AND (customer.rep_id != appointment.closed_by OR appointment.closed_by IS NULL) 
AND customer.rep_id != 0 
AND customer.deleted = 0 
AND office.visible = 1 
AND office.deleted = 0 
AND appointment.date >= '2016-12-01' 
AND appointment.date < '2017-11-30' 
AND appointment.current = 1 
GROUP BY branch.id 
ORDER BY Completed 

はEXPLAIN出力されます:

id: 1 
select_type: simple 
table: office 
type: ref 
possible_keys: PRIMARY, deleted_branchID_name, deleted_visible 
key: deleted_visible 
key_len: 5 
ref: const,const 
rows: 73 
Extra: Using index condition; Using temporary; Using filesort 

id: 1 
select_type: simple 
table: branch 
type: eq_ref 
possible_keys: PRIMARY 
key: PRIMARY 
key_len: 4 
ref: office.branch_id 
rows: 1 
Extra: NULL 

id: 1 
select_type: simple 
table: rep 
type: ref 
possible_keys: PRIMARY, group_id, office_id, active_deleted 
key: office_id 
key_len: 5 
ref: office.id 
rows: 57 
Extra: Using index condition; Using where 

id: 1 
select_type: simple 
table: customer 
type: ref 
possible_keys: PRIMARY, rep_id 
key: rep_id 
key_len: 4 
ref: rep.id 
rows: 61 
Extra: Using where 

id: 1 
select_type: simple 
table: appointment 
type: ref 
possible_keys: date, customer_id, closedByID_date, isCurrent_date 
key: customer_id 
key_len: 4 
ref: customer.id 
rows: 1 
Extra: Using where 
+0

に周り)(役に立たないと削除、クエリが示唆します索引 'オフィス(削除された、目に見える、branch_id)'。しかし、この表にはほんの一握りの行が含まれているように見えるため、この索引は多分役立たないでしょう。より良い戦略を選択するには、強力なフィルタを特定することができます。たとえば99%のデータに 'customer.saved = 1'または' appointment.current!= 1'がある場合は、これを使ってクエリを最適化することができますが、データに依存します。また、明確にするためには、最後の 'left join'を' join'で置き換えるべきです( 'office.branch_id'が' not null'でもある場合は最後のものも置き換えてください) – Solarflare

答えて

0

提案

があなたのデータについては何も知らない状態

LEFT JOIN customer ON rep.id = customer.rep_id 
    LEFT JOIN office ON rep.office_id = office.id 
    LEFT JOIN appointment ON customer.id = appointment.customer_id 
    LEFT JOIN branch ON office.branch_id = branch.id