我有一個查詢mysql的索引和聯接
SELECT `a`.restid, `b`.`name` AS execname, `c`.`dept_name`
FROM `tk_ticket` AS a
INNER JOIN `tk_acp_users` AS b ON `a`.`exec_id` = `b`.`id`
INNER JOIN `tk_ticket_dept` AS c ON `a`.`dept_id` = `c`.`dept_id`
WHERE `a`.`dept_id` IN(9,11)
AND `a`.`status` = 0
ORDER BY `a`.`date` DESC, `a`.`dept_id`
Explain輸出
1 SIMPLE a ALL exec_id_2 5391 Using where; Using filesort
1 SIMPLE b eq_ref PRIMARY PRIMARY 2 tk_new_db.a.exec_id 1
1 SIMPLE c eq_ref PRIMARY PRIMARY 1 tk_new_db.a.dept_id 1 Using where
當我運行一個解釋,我得到表全表掃描,如何防止這種情況的發生我添加了一個鍵(exec_id,dept_id,狀態),但不考慮該索引。
什麼主鍵:如果列不構成索引
你可以閱讀更多的,這裏的最左前綴
MySQL不能使用索引? – 2012-03-24 05:46:37
你可以發佈解釋計劃的輸出嗎? – 2012-03-24 05:48:16
我想「ORDER BY'a'.'date'」導致全表掃描。沒時間去測試它,所以這只是一個盲目的猜測,對不起。 – Timur 2012-03-24 06:09:50