假设您有这样的查询...
SELECT T.TaskID, T.TaskName, TAU.AssignedUsers
FROM `tasks` T
LEFT OUTER JOIN (
SELECT TaskID, GROUP_CONCAT(U.FirstName, ' ',
U.LastName SEPARATOR ', ') AS AssignedUsers
FROM `tasks_assigned_users` TAU
INNER JOIN `users` U ON (TAU.UserID=U.UserID)
GROUP BY TaskID
) TAU ON (T.TaskID=TAU.TaskID)
可以将多个人分配给给定任务。此查询的目的是为每个任务显示一行,但分配给任务的人员在一列中
现在...假设您在 、 和 上设置了正确tasks
的users
索引tasks_assigned_users
。tasks
MySQL 优化器在加入派生表时仍然不会使用 TaskID 索引。WTF?!?!?
所以,我的问题是......如何让这个查询使用 tasks_assigned_users.TaskID 上的索引?临时表很蹩脚,所以如果这是唯一的解决方案...... MySQL 优化器是愚蠢的。
使用的索引:
- 任务
- 主要 - 任务 ID
- 用户
- 主要 - 用户 ID
- tasks_assigned_users
- 主要 - (任务 ID,用户 ID)
- 附加索引 UNIQUE - (UserID,TaskID)
编辑:另外,这个页面说派生表在连接发生之前执行/实现。为什么不重新使用密钥来执行连接呢?
编辑 2: MySQL 优化器不会让您在派生表上放置索引提示(可能是因为派生表上没有索引)
编辑 3:这是一篇非常好的博客文章:http: //venublog.com/2010/03/06/how-to-improve-subqueries-derived-tables-performance/ 请注意,案例 #2 是我的解决方案正在寻找,但目前 MySQL 似乎不支持此功能。:(
编辑 4:刚刚发现:“从 MySQL 5.6.3 开始,优化器更有效地处理 FROM 子句中的子查询(即派生表):...在查询执行期间,优化器可能会向派生表添加索引以加快从中检索行的速度。” 看起来很有希望...