繁体   English   中英

如何告诉MySQL Optimizer在派生表上使用索引?

[英]How do I tell the MySQL Optimizer to use the index on a derived table?

假设您有这样的查询......

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)

可以将多个人分配给给定任务。 此查询的目的是为每个任务显示一行,但将人员分配给单个列中的任务

现在......假设您在tasksuserstasks_assigned_users上设置了正确的索引。 在加入时,MySQL优化仍然不会使用的TaskID指标tasks的派生表。 WTF?!?!?

所以,我的问题是......如何使这个查询使用tasks_assigned_users.TaskID上的索引? 临时表是蹩脚的,所以如果这是唯一的解决方案...... MySQL优化器是愚蠢的。

使用的索引:

  • 任务
    • PRIMARY - TaskID
  • 用户
    • 主要 - 用户ID
  • tasks_assigned_users
    • PRIMARY - (TaskID,UserID)
    • 附加索引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子句(即派生表):......在查询执行,优化程序可以添加一个索引来派生表加快从中检索行。“ 似乎有希望......

在MySQL Server 5.6中有一个解决方案 - 预览版本(在撰写本文时)。

http://dev.mysql.com/doc/refman/5.6/en/from-clause-subquery-optimization.html

虽然,我不确定MySQL优化器是否会重新使用已经存在的索引,当它“将索引添加到派生表”时

请考虑以下查询:

SELECT * FROM t1 JOIN(SELECT * FROM t2)AS derived_t2 ON t1.f1 = derived_t2.f1;

文档说:“优化器在derived_t2的列f1上构造一个索引,如果这样做将允许使用ref访问来获得最低成本的执行计划。”

好的,这很好,但优化器是否重用了t2的索引? 换句话说,如果t2.f1存在索引怎么办? 是否重新使用此索引,或者优化程序是否为派生表重新创建此索引? 谁知道?

编辑: MySQL 5.6之前的最佳解决方案是创建临时表,在该表上创建索引,然后在临时表上运行SELECT查询。

我看到的问题是,通过执行子查询,没有底层索引表。 如果你有表演,我会在最后进行分组,如下所示:

SELECT T.TaskID, T.TaskName, GROUP_CONCAT(U.FirstName, ' ', U.LastName SEPARATOR ', ') AS AssignedUsers
FROM `tasks` T
    LEFT OUTER JOIN  `tasks_assigned_users` TAU ON (T.TaskID=TAU.TaskID)
    INNER JOIN `users` U ON (TAU.UserID=U.UserID)
GROUP BY T.TaskID, T.TaskName

我担心,这是不可能的 您必须创建临时表或视图才能使用索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM