2017-02-22 323 views
1

查詢需要很長時間才能響應〜40分鐘。MySQL NOT IN查詢花費太長的時間來響應

`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)
  • 頻率VARCHAR(2)
  • 130000行與where子句
  • 行總數160000
  • consumer_id上的唯一索引
  • in DEX上active_flag

transaction表具有

  • consumer_id VARCHAR(12)
  • active_flag VARCHAR(6)
  • 狀態VARCHAR(20)
  • 週期VARCHAR(13)
  • 108000行,其中有條款
  • 總排數270000
  • 指數consumer_id狀態和循環

服務器配置

-16GB RAM -8核Intel(R)至強(R)CPU E5-4640 V2 @ 2.20GHz -MySQL 35年5月6日

解釋回報 SQL QUERY EXPLAIN

我希望這有助於。 在此先感謝。

更新1

消費和交易有一個一對多的關係 所以consumer_id會重複每一個週期。

+0

請問您還可以添加您的JOIN查詢嗎? – marijnz0r

回答

0

內加入的伎倆,我

SELECT DISTINCT c.consumer_id FROM consumer c 
INNER JOIN 
    (SELECT DISTINCT consumer_id as sid from transactions where consumer_id not in (
    select consumer_id from transactions 
    where cycle = '2016-Q-2' AND active_flag = 'Y' AND status != 'Door Locked' 
)) as s 
ON s.sid = c.consumer_id 
WHERE c.active_flag = 'Y' AND (c.frequency = 'Q') 

不知道這是否正確的做法,但響應時間降到〜700毫秒現在。

不知道爲什麼,但是來自上述所有答案的查詢響應都提供了交易表中所有可用的消費者id。

0

使用左連接你會得到「NULL」值

嘗試用內部聯接可能是它幫助你

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') 
0

使用權加入或內連接來得到你想要的結果。 爲了加快查詢速度,您應該將索引添加到WHERE子句中的所有字段。祝你好運!

SELECT DISTINCT c.consumer_id FROM consumer c 
INNER JOIN transactions s 
ON s.cycle != '2016-Q-2' AND s.active_flag != 'Y' AND s.status = 'Door Locked' 
WHERE c.active_flag = 'Y' 
AND c.frequency = 'Q' 
0

我不知道你的數據是什麼樣子,所以我不能確定,如果下面的工作,但你可能要與您的查詢的基本邏輯玩,因爲你正在尋找這樣做應該是沒有達到什麼使用子查詢。

作爲一般規則,您總是希望遠離使用子查詢,因爲它們效率極低。