2011-01-26 31 views
0

我在使用MySQL中的派生表時遇到問題。使用派生表是否固有地減慢了查詢的處理速度?SQL中派生表的性能問題

這是我試圖運行的查詢。它不會執行,只是超時。

它確實成功。真的,我已經將問題隔離到最後一次加入。當我拿出最後一個連接時,它工作正常。但是當我添加最後一個連接時拒絕執行。

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; 
+0

當你自己運行子查詢時會發生什麼?它成功了嗎?我會自己做一個關於子查詢的解釋,然後就整個查詢做一個解釋。 – TehShrike 2011-01-26 17:07:37

回答

2

希望這有助於...這裏有一些MySQL的CREATE INDEX語句。基本上,如果您可以添加索引,請確保有一個索引涵蓋連接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); 

派生表是不是天生壞的,但在這種情況下(見下文),你拉都來自consumer_action_log具有爲4的comm_type_id記錄似乎沒有成爲一個連接回其他表格。這可能是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; 
1
從應該在你的查找表存在由約翰雁指出,指標

除此之外,我會確保你在你的consumer_action_log表對COMM_TYPE_ID索引了。

然後,一個關鍵字添加到您的條款......我始終認爲,偉大的結果時,查詢良好的組織,而不是依靠查詢引擎...,進而優化see another sample here

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

它可能是優化器正試圖查看其他表來找出要得到的東西。請參閱我提供的其他StackOverflow答案鏈接。