优化这段SQL:SELECT CONCAT( HOUR ( mail_send_time ) DIV 1 * 1, ':00-', HOUR ( mail_send_time ) DIV 1 * 1, ':59' ) AS timeInterval, IFNULL( COUNT( * ), 0 ) AS total, IFNULL( SUM( contact_account_type in (SELECT code_description FROM dwd_t_code_value WHERE code_value = '01') ), 0 ) AS wxTotal, IFNULL( SUM( contact_account_type IN (SELECT code_description FROM dwd_t_code_value WHERE code_value = '02') ), 0 ) AS qqTotal, IFNULL( SUM( local_action = (SELECT code_description FROM dwd_t_code_value WHERE code_value = '05') AND contact_account_type = (SELECT code_description FROM dwd_t_code_value WHERE code_value = '01') ), 0 ) AS wxSend, IFNULL( SUM( local_action = (SELECT code_description FROM dwd_t_code_value WHERE code_value = '06') AND contact_account_type = (SELECT code_description FROM dwd_t_code_value WHERE code_value = '01')), 0 ) AS wxReceive , IFNULL( SUM( local_action = (SELECT code_description FROM dwd_t_code_value WHERE code_value = '05') AND contact_account_type = (SELECT code_description FROM dwd_t_code_value WHERE code_value = '02')), 0 ) AS qqSend, IFNULL( SUM( local_action = (SELECT code_description FROM dwd_t_code_value WHERE code_value = '06') AND contact_account_type = (SELECT code_description FROM dwd_t_code_value WHERE code_value = '02')), 0 ) AS qqReceive FROM dwd_t_friend_talk, dwd_t_code_value WHERE person_no = '653129200105072624' AND contact_account_type IN ( '微信', 'QQ' ) AND friend_account <> '' AND contact_account_type <> '' AND mail_send_time IS NOT NULL AND mail_send_time <> '' GROUP BY HOUR ( mail_send_time ) DIV 1
时间: 2024-04-07 09:32:24 浏览: 73
可以尝试以下优化措施:
1. 将子查询转化为 JOIN 操作:将子查询(SELECT code_description FROM dwd_t_code_value WHERE code_value = '01') 转化为 JOIN dwd_t_code_value on dwd_t_code_value.code_value = '01',避免子查询的重复执行。
2. 将 IFNULL 函数替换为 COALESCE 函数,COALESCE 函数可以同时处理多个参数,效率更高。
3. 使用具有更好性能的索引:可以考虑在 dwd_t_friend_talk 表的 person_no 和 contact_account_type 字段上建立联合索引,提高查询效率。
4. 避免在 WHERE 子句中使用函数:可以将 HOUR(mail_send_time) 的计算移到 SELECT 子句中,避免在 WHERE 子句中使用函数,提高查询效率。
优化后的 SQL 语句如下:
SELECT
CONCAT(HOUR(mail_send_time) DIV 1 * 1, ':00-', HOUR(mail_send_time) DIV 1 * 1, ':59') AS timeInterval,
COALESCE(COUNT(*), 0) AS total,
COALESCE(SUM(contact_account_type = '微信'), 0) AS wxTotal,
COALESCE(SUM(contact_account_type = 'QQ'), 0) AS qqTotal,
COALESCE(SUM(local_action = '05' AND contact_account_type = '微信'), 0) AS wxSend,
COALESCE(SUM(local_action = '06' AND contact_account_type = '微信'), 0) AS wxReceive,
COALESCE(SUM(local_action = '05' AND contact_account_type = 'QQ'), 0) AS qqSend,
COALESCE(SUM(local_action = '06' AND contact_account_type = 'QQ'), 0) AS qqReceive
FROM
dwd_t_friend_talk
JOIN dwd_t_code_value ON dwd_t_code_value.code_value = '01' OR dwd_t_code_value.code_value = '02'
WHERE
person_no = '653129200105072624'
AND contact_account_type IN ('微信', 'QQ')
AND friend_account <> ''
AND contact_account_type <> ''
AND mail_send_time IS NOT NULL
AND mail_send_time <> ''
GROUP BY
HOUR(mail_send_time) DIV 1
阅读全文