Mariadb 无法执行包含过多数据的大查询

Maria DB fails to execute big query with too much data

我有两个 table,customercustomer_risk_score。记录新客户后,客户 table 就会增长。我将客户数据插入 customer_risk_score.

我的情况是 customer_risk_score Table 中有超过 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 条记录,客户 table 有 699,780 条记录,查询 运行 永远没有终止或错误消息。 O 测试了它并等待了 3 小时然后手动终止它。我什至达到了通过终端通过执行 show processlist 杀死 DBMS 上的所有进程 运行ning 的地步,这是唯一的进程 运行ning.

当 customer_risk_score 被 运行 访问并且我重新运行 查询时,大约需要 3 秒才能将客户 table 的特定条目插入到customer_risk_score。

此查询计划每两小时 运行 一次,我的问题是导致延迟的原因。是 mariaDB 版本中的错误还是我的查询以错误的方式设计?我正在使用 MariaDB 版本 @@version 5.5.49-MariaDB-1ubuntu0.14.04.1

提前致谢!

我会将 not in 子查询更改为 left join ... is null 连接,并确保在 tables:

中对 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 table,原始 table 中的子查询会迅速增长。我提出的解决方案中的连接条件消除了大部分这些记录。

另一种解决方案是在子查询中使用 not exists 运算符而不是 not in.

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