Mysql索引和连接

时间:2012-03-24 05:45:06

标签: 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`

解释输出

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)但不考虑此索引。

2 个答案:

答案 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