查询响应时间太长,大约需要 40 分钟。
`SELECT c.consumer_id FROM consumer c
WHERE c.active_flag = 'Y'
AND ( c.frequency = 'Q' )
AND c.consumer_id NOT IN(
SELECT consumer_id
FROM (SELECT s.consumer_id
FROM transactions s
WHERE ( s.cycle='2016-Q-2' ) and s.active_flag = 'Y' AND s.status <> 'Door Locked')
AS subquery)`
我也尝试过同时使用 NOT EXISTS 和 LEFT JOIN/IS NULL 版本的上述查询。
consumer
表有
- consumer_id varchar(12)
- active_flag varchar(6)
- 频率变量 (2)
- 130000 行带有 where 子句
- 总行数 160000
- consumer_id 的唯一索引
- active_flag 上的索引
事务
表有
- consumer_id varchar(12)
- active_flag varchar(6)
- 状态变量 (20)
- 循环 varchar (13)
- 108000 行带有 where 子句
- 总行数 270000
- consumer_id 状态和周期索引
服务器配置
-16GB 内存 -8 核英特尔(R) 至强(R) CPU E5-4640 v2 @ 2.20GHz -MySQL 5.6.35
解释返回 SQL QUERY EXPLAIN
希望对您有所帮助。 提前致谢。
更新 1
消费者和交易是一对多的关系 因此 consumer_id 将在每个周期重复。</p>
最佳答案
使用左连接你会得到'NULL'值
试试 inner join 可能对你有帮助
SELECT c.consumer_id FROM consumer c
JOIN
(SELECT s.consumer_id as S_ID
FROM transactions s
WHERE (s.cycle='2016-Q-2') and s.active_flag = 'Y' AND s.status <>
'Door Locked')
ON s.S_ID <> c.consumer_id
WHERE c.active_flag = 'Y' AND ( c.frequency = 'Q' )
关于MySQL NOT IN 查询响应时间过长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42394864/