Mariadb 无法执行包含过多数据的大查询
Maria DB fails to execute big query with too much data
我有两个 table,customer
和 customer_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
需要编入索引。
我有两个 table,customer
和 customer_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:
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
需要编入索引。