0
我想優化下面的mysql查詢。它運行約2.5秒。我已經閱讀了複合索引,但我希望有人能夠幫助我理解你如何將複合索引與這些包含多個聯接的查詢複合,其中許多條件(包括日期範圍),一個組合以及一個order by一個計算值。我是否缺少有用的複合索引?有沒有更有效的方法,我應該從這些表中提取數據?任何幫助非常感謝!複合索引順序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
周圍不知道你的數據進行任何刪除無用的(),您的查詢暗示索引'辦公室(刪除,可見,branch_id)'。然而,這張表似乎只包含少數幾行,因此這個索引可能沒有多大幫助;要選擇更好的策略,您可以嘗試識別強大的過濾器。如果例如99%的數據將具有'customer.saved = 1'或'appointment.current!= 1',您可以嘗試使用它來優化您的查詢 - 但這取決於您的數據。另外,爲了清楚起見,你應該用'join'來替換除最後一個'left join'(如果'office.branch_id'爲'not null',那麼最後一個也是如此) – Solarflare