Maria DB无法使用过多的数据执行大查询

时间:2016-07-07 09:25:51

标签: mysql sql mariadb

我有两个表,customercustomer_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,当cu​​stomer_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

提前致谢!

2 个答案:

答案 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需要编入索引。