我在使用 MySQL 中的派生表时遇到问题。使用派生表本质上会减慢查询的处理速度吗?

这是我尝试运行的查询。它不会执行并且只是超时。

它确实成功了。确实,我已将问题隔离到最后一次加入。当我取出最后一个连接时,它工作正常。但是当我将最后一个连接添加回来时,它拒绝执行。

SELECT cr.COMMUNICATIONS_ID AS ANSWER_ID, 
       cr.CONSUMER_ID as VIEWER_ID, 
       cr.ACTION_LOG_ID, 
       nc.PARENT_COMMUNICATIONS_ID AS QUESTION_ID, 
       nc.SENDER_CONSUMER_ID AS REPLIER_ID, 
       ces.EXPERT_SCORE AS REPLIER_EXPERTISE, 
       cim.CONSUMER_INTEREST_EXPERT_ID AS DOMAIN
    FROM (SELECT 234 AS CONSUMER_ID, 
    ACTION_LOG_ID, 
    COMMUNICATIONS_ID 
    FROM consumer_action_log 
    WHERE COMM_TYPE_ID=4) AS cr
JOIN network_communications AS nc ON 
cr.COMMUNICATIONS_ID=nc.COMMUNICATIONS_ID
JOIN communication_interest_mapping AS cim ON 
nc.PARENT_COMMUNICATIONS_ID=cim.COMMUNICATION_ID
JOIN consumer_expert_score AS ces ON 
nc.SENDER_CONSUMER_ID=ces.CONSUMER_ID
        AND cim.CONSUMER_INTEREST_EXPERT_ID=ces.CONSUMER_EXPERT_ID;
有帮助吗?

解决方案

希望这会有所帮助...这是一些MySQL创建索引语句。基本上,如果您可以添加索引,请确保有一个索引覆盖您连接2个或更多表的每个列的索引。

CREATE INDEX idx_nc
ON network_communications(COMMUNICATIONS_ID);

CREATE INDEX idx_cim
ON communication_interest_mapping(COMMUNICATION_ID);

CREATE INDEX idx_ces
ON consumer_expert_score(CONSUMER_ID, CONSUMER_EXPERT_ID);

派生表并非天生不好,但是在这种情况下(请参见下文),您正在从具有comm_type_id为4的Commenter_action_log中拉出所有记录。似乎没有与其他表的连接。这可能是SQL永远不会返回的原因。

SELECT cr.COMMUNICATIONS_ID, 
           cr.CONSUMER_ID, 
           cr.ACTION_LOG_ID, 
           nc.PARENT_COMMUNICATIONS_ID, 
           nc.SENDER_CONSUMER_ID, 
           ces.EXPERT_SCORE, 
           cim.CONSUMER_INTEREST_EXPERT_ID

    FROM (SELECT 234 AS CONSUMER_ID, 
             ACTION_LOG_ID, 
             COMMUNICATIONS_ID 
             FROM consumer_action_log 
             WHERE COMM_TYPE_ID=4) AS cr

JOIN network_communications AS nc ON 
         cr.COMMUNICATIONS_ID=nc.COMMUNICATIONS_ID

JOIN communication_interest_mapping AS cim ON 
         nc.PARENT_COMMUNICATIONS_ID=cim.COMMUNICATION_ID

JOIN consumer_expert_score AS ces ON 
         nc.SENDER_CONSUMER_ID=ces.CONSUMER_ID
        AND cim.CONSUMER_INTEREST_EXPERT_ID=ces.CONSUMER_EXPERT_ID;

其他提示

除了 John 在 anser 中指出的查找表中应存在的索引之外,我还确保您的 Consumer_action_log 表中也有 COMM_TYPE_ID 上的索引。

然后,在您的子句中添加一个关键字...当查询组织良好而不是依赖查询引擎来优化时,我总是看到很好的结果......在这里查看另一个示例

SELECT STRAIGHT_JOIN
         cr.COMMUNICATIONS_ID AS ANSWER_ID,
         cr.CONSUMER_ID as VIEWER_ID,  
         etc... rest of your query...

优化器可能正在尝试查看其他表以找出要获取的内容。请参阅我提供链接的其他 StackOverflow 答案中的评论。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top