Mysql索引和连接
我有一个问题Mysql索引和连接,mysql,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`.
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
当我运行explain时,我得到了表a的完整表扫描,如何防止这种情况发生我添加了一个键(exec\u id,dept\u id,status),但没有考虑这个索引。我认为MySQL不能在这里使用(exec\u id,dept\u id,status)上的索引,因为WHERE子句中没有exec\u id。尝试在(dept\u id,status)上添加索引,或者在(exec\u id)上为联接添加单独的索引。请参见我认为MySQL不能在这里使用(exec\u id、dept\u id、status)上的索引,因为WHERE子句中没有exec\u id。尝试在(dept\u id,status)上添加索引,或者在(exec\u id)上为联接添加单独的索引。请参见因为WHERE子句使用dept\u id和status,而不是exec\u id,所以不会使用您创建的索引 这是因为,如果表具有多列索引,则优化器可以使用索引的任何最左侧前缀来查找行。例如,如果在(col1,col2,col3)上有一个三列索引,则在(col1),(col1,col2)和(col1,col2,col3)上有索引搜索功能 如果列不构成索引的最左侧前缀,MySQL将无法使用索引
您可以在此处阅读更多内容:因为WHERE子句使用dept\u id和status,而不是exec\u id,所以不会使用您创建的索引 这是因为,如果表具有多列索引,则优化器可以使用索引的任何最左侧前缀来查找行。例如,如果在(col1,col2,col3)上有一个三列索引,则在(col1),(col1,col2)和(col1,col2,col3)上有索引搜索功能 如果列不构成索引的最左侧前缀,MySQL将无法使用索引
您可以在这里阅读更多内容:主键如何?您可以发布解释计划的输出吗?我猜“ORDER BY
a
date
”会导致全表扫描。没有时间测试它,所以这只是一个瞎猜,对不起。@timur即使我删除了order by子句,我也会得到一个完整的表扫描。主键呢?你能发布解释计划的输出吗?我猜“order bya
日期”会导致完整的表扫描。没有时间测试它,所以这只是一个瞎猜,对不起。@timur即使在我删除orderby子句之后,我也会得到一个完整的表扫描