2012-03-24 49 views
1

我有一個查詢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,狀態),但不考慮該索引。

+1

什麼主鍵:如果列不構成索引

你可以閱讀更多的,這裏的最左前綴

MySQL不能使用索引? – 2012-03-24 05:46:37

+0

你可以發佈解釋計劃的輸出嗎? – 2012-03-24 05:48:16

+0

我想「ORDER BY'a'.'date'」導致全表掃描。沒時間去測試它,所以這只是一個盲目的猜測,對不起。 – Timur 2012-03-24 06:09:50

回答

0

由於您的WHERE子句使用dept_id和status,但不使用exec_id,因此不會使用您創建的索引。

這是因爲,如果表具有多列索引,則優化器可以使用該索引的任何最左邊的前綴來查找行。例如,如果您在(col1,col2,col3)上有三列索引,則您在(col1),(col1,col2)和(col1,col2,col3)上具有索引搜索功能。 http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html