如何使下面的Mysql查询更有效?
SELECT
DISTINCT crm_task_id,
table_header_id
FROM
table_details
WHERE
table_header_id IN (
SELECT
table_header_id
FROM
table_header
WHERE
crm_campaign_id =196
AND crm_campaign_post_code_id IN (
SELECT
crm_campaign_post_code_id
FROM
crm_campaign_post_code
WHERE
is_display_operator IN (
1, 0
)
)
AND g_user_id IN (
SELECT
g_user_id
FROM
crm_user
WHERE
is_active =1
)
AND DATE_FORMAT( created, '%Y-%m-%d' ) BETWEEN '2015-12-01' AND '2016-01-04'
)
AND crm_task_id NOT IN (
SELECT
crm_task_id
FROM
table_details
WHERE
table_header_id IN (
SELECT
table_header_id
FROM
table_header
WHERE
crm_campaign_id =196
AND crm_post_code_categ_id !=1000
)
)
table_header列:
| table_header_id | bigint(20)
| created | datetime
| updated | datetime
| createdby | bigint(20)
| updatedby | bigint(20)
| is_active | char(1)
| crm_user_session_id | bigint(20)
| crm_campaign_id | bigint(20)
| crm_post_code_categ_id | bigint(20)
| value | varchar(128)
| crm_campaign_post_code_id | bigint(20)
| crm_filter_id | bigint(20)
| g_user_id | bigint(20)
| session_time | int(100)
table_details列:
| table_details_id | bigint(11)
| table_header_id | bigint(11)
| created | datetime
| updated | datetime
| createdby | bigint(11)
| updatedby | bigint(11)
| is_active | smallint(5)
| crm_contact_id | varchar(60)
| crm_task_id | bigint(11)
以上查询返回结果需要2秒以上,请任何人都可以重写此查询以更快地返回结果!!!
答案 0 :(得分:1)
试试这个。
SELECT
DISTINCT td.crm_task_id,
td.table_header_id
FROM
table_details td
join
table_header th
on th.table_header_id = td.table_header_id
and th.crm_campaign_id =196
and th.crm_post_code_categ_id !=1000
join
crm_campaign_post_code ccpc
on ccpc.crm_compaign_post_code_id = th.crm_campaign_post_code_id
and ccpc.is_display_operator IN (
1,
0 )
and DATE_FORMAT( created,
'%Y-%m-%d' ) BETWEEN '2015-12-01' AND '2016-01-04'
join
crm_user cr
on cr.g_user_id = ccpc.g_user_id
and cr.is_active = 1
答案 1 :(得分:1)
试试这个
SELECT DISTINCT crm_task_id, td.table_header_id
FROM table_details td
WHERE table_header_id
JOIN table_header th
ON td.table_header_id = th.table_header_id
AND th.crm_campaign_id =196
JOIN crm_campaign_post_code c
ON c.crm_campaign_post_code_id = th.crm_campaign_post_code_id
AND is_display_operator IN ( 1, 0 )
JOIN crm_user u
ON u.g_user_id = c.g_user_id
AND is_active =1
AND DATE_FORMAT( created, '%Y-%m-%d' )
BETWEEN '2015-12-01'
AND '2016-01-04'
WHERE u.crm_task_id NOT
IN (
SELECT IFNULL(crm_task_id,0)
FROM table_details
WHERE table_header_id
IN (
SELECT table_header_id
FROM table_header
WHERE crm_campaign_id =196
AND crm_post_code_categ_id !=1000
))
答案 2 :(得分:0)
试试这个:
SELECT DISTINCT crm_task_id, table_header_id
FROM table_details
WHERE table_header_id
IN (
select table_header_id From
(
SELECT table_header_id
FROM table_header
WHERE crm_campaign_id =196
AND crm_campaign_post_code_id
IN (
select crm_campaign_post_code_id from (
SELECT crm_campaign_post_code_id
FROM crm_campaign_post_code
WHERE is_display_operator
IN ( 1, 0 )
) temp2
)
AND g_user_id
IN (
select g_user_id from (
SELECT g_user_id
FROM crm_user
WHERE is_active =1
) temp3
)
AND DATE_FORMAT( created, '%Y-%m-%d' ) BETWEEN '2015-12-01' AND '2016-01-04'
) as temp_1
)
AND crm_task_id NOT IN (
SELECT crm_task_id FROM table_details WHERE table_header_id
IN (
select table_header_id From (
SELECT table_header_id
FROM table_header
WHERE crm_campaign_id =196
AND crm_post_code_categ_id !=1000
) temp4
)
)
答案 3 :(得分:0)
避免IN ( SELECT ... )
;它没有很好地优化。而是将其转换为JOIN
。例如:
SELECT crm_task_id
FROM table_details
WHERE table_header_id IN (
SELECT table_header_id
From
( SELECT table_header_id
FROM table_header
WHERE crm_campaign_id =196
AND crm_post_code_categ_id !=1000 ) temp4 )
- >
SELECT crm_task_id
FROM table_details AS d
JOIN table_header AS h ON d.table_header_id = h.table_header_id
WHERE h.crm_campaign_id =196
AND h.crm_post_code_categ_id !=1000