2016-07-07 35 views
0

我有兩個表,customercustomer_risk_score執行大的查詢。記錄新客戶時,客戶表增長。我會將customer數據插入customer_risk_score。瑪麗亞DB失敗,太多的數據

我的情況是我在customer_risk_score表超過245890項和客戶項目已增長到699780條記錄。

當我通過phpmyadmin的運行此查詢到

INSERT INTO customer_risk_score (rim, client_code, calculated_on) 
    SELECT rim, client_type, Now() 
    FROM customer 
    WHERE rim NOT IN (SELECT rim FROM customer_risk_score) 

,在這一點上,當customer_risk_score擁有約245890記錄,並699780客戶表,查詢永遠運行下去沒有終止或錯誤消息。 O測試它並等待3小時,然後手動終止它。我甚至通過執行show processlist來終止在DBMS上運行的所有進程,這是唯一的進程正在運行。

當customer_risk_score被截斷,我重新運行查詢,大約需要3秒插入從客戶表中的具體條目customer_risk_score。

此查詢計劃每兩小時運行,我的問題會是什麼原因導致延遲。這是在mariaDB版本中的錯誤,或者我的查詢是以錯誤的方式設計的?正在使用MariaDB VERSION @@版本 5.5.49-MariaDB-1ubuntu0.14.04.1

在此先感謝!

+0

感謝@Jarlh編輯我的問題。它給了我一個很酷的答案 –

回答

1

我會改變not in子查詢到left join ... is null加入,將確保邊緣列索引的兩個表中:

INSERT INTO customer_risk_score (rim, client_code, calculated_on) 
    SELECT c.rim, c.client_type, Now() 
    FROM customer c 
    LEFT JOIN customer_risk_score crs on c.rim=crs.rim and crs.rim is null 

隨着越來越多的記錄插入您的原始表的子查詢快速增長進入customer_risk_score表。我建議的解決方案中的連接條件消除了大部分這些記錄。

另一種解決方案是使用not exists運算符與子查詢而不是not in

+0

我試過你的查詢索引的列和我手動終止它在7分鐘,但是當我索引的列只需要14.73秒。謝謝影子 –

+0

沒有索引輪圈列MySQL將被迫掃描整個表以匹配記錄。 – Shadow

0

@ Shadow的解決方案很接近,但有一個致命的缺陷。這應該更好的工作:

INSERT INTO customer_risk_score (rim, client_code, calculated_on) 
    SELECT c.rim, c.client_type, Now() 
    FROM customer c 
    LEFT JOIN customer_risk_score crs on c.rim=crs.rim 
    WHERE crs.rim is null; -- see note below 

NULL的檢查一定不能在ON;它必須在WHERE

而且,是的,rim需要進行索引。