我有两个表,customer
和customer_risk_score
。记录新客户时,客户表会增长。我将客户数据插入到customer_risk_score。
我的情况是,我在customer_risk_score表中有超过245,890个条目,并且客户条目已增加到699,780条记录。
当我将此查询运行到
时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)
通过phpmyadmin,当customer_risk_score有大约245,890条记录和客户表有699,780时,查询将永远运行没有终止或错误消息。 O测试它并等待3个小时然后手动终止它。我甚至通过执行show processlist来终止通过终端杀死在DBMS上运行的所有进程,并且它是唯一运行的进程。
当截断customer_risk_score并重新运行查询时,将customer表中的特定条目插入customer_risk_score大约需要3秒钟。
此查询计划每两个小时运行一次,我的问题是导致延迟的原因。它是mariaDB版本中的错误还是我的Query设计错误?我正在使用MariaDB VERSION @@版本 49年5月5日 - MariaDB的-1ubuntu0.14.04.1
提前致谢!
答案 0 :(得分:1)
我会将not in
子查询更改为left join ... is null
连接,并确保在两个表中对rim列进行索引:
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
。
答案 1 :(得分: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
需要编入索引。