Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL查询优化消除不必要的连接_Mysql_Sql_Optimization_Query Optimization - Fatal编程技术网

MySQL查询优化消除不必要的连接

MySQL查询优化消除不必要的连接,mysql,sql,optimization,query-optimization,Mysql,Sql,Optimization,Query Optimization,从概念上讲,我试图为系统中的每个用户获取8个单独的调查分数。我想输出连接到同一行上输出的给定用户的所有8个分数。以下是我实现这一目标的最佳途径: SELECT cp.CONSUMER_ID, bsr1.SCORE AS SET_1_SCORE, bsr2.SCORE AS SET_2_SCORE, bsr3.SCORE AS SET_3_SCORE, bsr4.SCORE AS SET_4_SCORE, bsr5.SCORE

从概念上讲,我试图为系统中的每个用户获取8个单独的调查分数。我想输出连接到同一行上输出的给定用户的所有8个分数。以下是我实现这一目标的最佳途径:

SELECT cp.CONSUMER_ID,
       bsr1.SCORE AS SET_1_SCORE,
       bsr2.SCORE AS SET_2_SCORE,
       bsr3.SCORE AS SET_3_SCORE,
       bsr4.SCORE AS SET_4_SCORE,
       bsr5.SCORE AS SET_5_SCORE,
       bsr6.SCORE AS SET_6_SCORE,
       bsr7.SCORE AS SET_7_SCORE,
       bsr8.SCORE AS SET_8_SCORE
FROM 
CONSUMER_PROFILE AS cp
LEFT JOIN survey_scores AS bsr1
ON bsr1.SET_ORDER=1 
AND bsr1.CUSTOMER_ID=cp.CONSUMER_ID
LEFT JOIN survey_scores AS bsr2
ON bsr2.SET_ORDER=2
AND bsr2.CUSTOMER_ID=cp.CONSUMER_ID
LEFT JOIN survey_scores AS bsr3
ON bsr3.SET_ORDER=3
AND bsr3.CUSTOMER_ID=cp.CONSUMER_ID
LEFT JOIN survey_scores AS bsr4
ON bsr4.SET_ORDER=4
AND bsr4.CUSTOMER_ID=cp.CONSUMER_ID
LEFT JOIN survey_scores AS bsr5
ON bsr5.SET_ORDER=5
AND bsr5.CUSTOMER_ID=cp.CONSUMER_ID
LEFT JOIN survey_scores AS bsr6
ON bsr6.SET_ORDER=6
AND bsr6.CUSTOMER_ID=cp.CONSUMER_ID
LEFT JOIN survey_scores AS bsr7
ON bsr7.SET_ORDER=7
AND bsr7.CUSTOMER_ID=cp.CONSUMER_ID
LEFT JOIN survey_scores AS bsr8
ON bsr8.SET_ORDER=8
AND bsr8.CUSTOMER_ID=cp.CONSUMER_ID

这将返回正确的输出,但是速度非常慢。您建议我如何优化它?

您首先需要的是一个关于调查分数(设置顺序、消费者id、分数)或至少是调查分数(设置顺序、消费者id)的索引。然后,即使使用您的查询,它也会非常有效

另一种写它的方式是

SELECT cp.CONSUMER_ID,
       MAX(CASE WHEN bsr1.SET_ORDER=1 THEN bsr1.SCORE END) AS SET_1_SCORE,
       MAX(CASE WHEN bsr1.SET_ORDER=2 THEN bsr1.SCORE END) AS SET_2_SCORE,
       MAX(CASE WHEN bsr1.SET_ORDER=3 THEN bsr1.SCORE END) AS SET_3_SCORE,
       MAX(CASE WHEN bsr1.SET_ORDER=4 THEN bsr1.SCORE END) AS SET_4_SCORE,
       MAX(CASE WHEN bsr1.SET_ORDER=5 THEN bsr1.SCORE END) AS SET_5_SCORE,
       MAX(CASE WHEN bsr1.SET_ORDER=6 THEN bsr1.SCORE END) AS SET_6_SCORE,
       MAX(CASE WHEN bsr1.SET_ORDER=7 THEN bsr1.SCORE END) AS SET_7_SCORE,
       MAX(CASE WHEN bsr1.SET_ORDER=8 THEN bsr1.SCORE END) AS SET_8_SCORE
FROM CONSUMER_PROFILE AS cp
LEFT JOIN survey_scores AS bsr1
ON bsr1.SET_ORDER in (1,2,3,4,5,6,7,8)
AND bsr1.CUSTOMER_ID=cp.CONSUMER_ID
GROUP BY cp.CONSUMER_ID

您需要的第一件事是调查分数索引(设置顺序、消费者id、分数)或至少是调查分数索引(设置顺序、消费者id)。然后,即使使用您的查询,它也会非常有效

另一种写它的方式是

SELECT cp.CONSUMER_ID,
       MAX(CASE WHEN bsr1.SET_ORDER=1 THEN bsr1.SCORE END) AS SET_1_SCORE,
       MAX(CASE WHEN bsr1.SET_ORDER=2 THEN bsr1.SCORE END) AS SET_2_SCORE,
       MAX(CASE WHEN bsr1.SET_ORDER=3 THEN bsr1.SCORE END) AS SET_3_SCORE,
       MAX(CASE WHEN bsr1.SET_ORDER=4 THEN bsr1.SCORE END) AS SET_4_SCORE,
       MAX(CASE WHEN bsr1.SET_ORDER=5 THEN bsr1.SCORE END) AS SET_5_SCORE,
       MAX(CASE WHEN bsr1.SET_ORDER=6 THEN bsr1.SCORE END) AS SET_6_SCORE,
       MAX(CASE WHEN bsr1.SET_ORDER=7 THEN bsr1.SCORE END) AS SET_7_SCORE,
       MAX(CASE WHEN bsr1.SET_ORDER=8 THEN bsr1.SCORE END) AS SET_8_SCORE
FROM CONSUMER_PROFILE AS cp
LEFT JOIN survey_scores AS bsr1
ON bsr1.SET_ORDER in (1,2,3,4,5,6,7,8)
AND bsr1.CUSTOMER_ID=cp.CONSUMER_ID
GROUP BY cp.CONSUMER_ID

您可以稍微进一步调整:

SELECT ... FROM consumer_profile as cp    
LEFT JOIN survey_scores as bsr1  
ON ((bsr1.Set_Order BETWEEN 1 AND 8)  
  AND (bsr1.Consumer_ID = cp.Consumer_ID))  
GROUP BY cp.Consumer_ID; 
如果您确定从不
设置顺序
超出范围1..8 然后您可以删除
(bsr1.Set_Order介于1和8之间)和
部分


除此之外,Richard的回答是一件美妙的事情。

你可以稍微调整一下:

SELECT ... FROM consumer_profile as cp    
LEFT JOIN survey_scores as bsr1  
ON ((bsr1.Set_Order BETWEEN 1 AND 8)  
  AND (bsr1.Consumer_ID = cp.Consumer_ID))  
GROUP BY cp.Consumer_ID; 
如果您确定从不
设置顺序
超出范围1..8 然后您可以删除
(bsr1.Set_Order介于1和8之间)和
部分


除此之外,Richard的回答很美。

请发布
解释
输出。请发布
解释
输出。