我有一个查询
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`
解释输出
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
当我运行解释时,我得到表a的全表扫描,如何防止这种情况发生我添加了一个键(exec_id,dept_id,status)但不考虑此索引。
答案 0 :(得分:1)
我不认为MySQL可以在这里使用索引(exec_id,dept_id,status),因为你的WHERE子句中没有exec_id。尝试在(dept_id,status)上添加索引,并且可能在JOIN上为(exec_id)添加单独的索引。见http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html
答案 1 :(得分:0)
由于您的WHERE子句使用dept_id和status,而不是exec_id,因此不会使用您创建的索引。
如果表具有多列索引,则优化程序可以使用索引的任何最左前缀来查找行。例如,如果在(col1,col2,col3)上有三列索引,则在(col1),(col1,col2)和(col1,col2,col3)上建立索引搜索功能。
如果列不构成索引的最左前缀
,则MySQL无法使用索引您可以在这里阅读更多内容:http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html