我有一个表A,其中包含超过 1 亿条记录。我想将另一个表中的数据插入到这个表中。目前,我面临批量插入的问题:前几批插入速度很快,但后续批次速度变慢
INSERT IGNORE INTO A (
u_id,
a_id,
c_id,
loc_id,
fr_owner,
dis_group_ids,
created_at,
updated_at
)
WITH
temp AS (
SELECT
temp.u_id AS u_id,
temp.a_id AS a_id,
temp.c_id AS c_id,
ca.job_loc_id AS job_loc_id,
temp.fr_owner AS fr_owner,
temp.dis_group_ids AS dis_group_ids,
CURRENT_TIMESTAMP(6) AS created_at,
CURRENT_TIMESTAMP(6) AS updated_at
FROM
TEMP_A AS temp
INNER JOIN C_A AS ca ON temp.a_id = ca.id
AND temp.c_id = ca.c_id
WHERE
temp.chunk_id = {CHUNK_ID}
AND temp.file_id = {FILE_ID}
AND temp.c_id = {C_ID}
LIMIT
{LIMIT}
)
SELECT
temp.*
FROM
temp
LEFT JOIN (
SELECT
*
FROM
A AS cur
WHERE
cur.c_id = {C_ID}
) cur ON temp.u_id = cur.u_id
AND temp.a_id = cur.a_id
WHERE
cur.id IS NULL
你能帮我优化上面的查询吗?或者你能为我分享一些向大表插入数据的解决方案吗
如果您有一个没有约束的表,那么插入后续批次(理论上)不应比第一批慢很多。因此,您遇到相反情况的事实意味着表中存在约束,例如唯一约束、检查约束、触发器、键、索引和主键。所有这些都会为您的插入添加检查。假设您有一个唯一的用户名。为了确保它保持唯一,每次插入记录时,系统都需要检查它是否仍然是唯一的。如果有 5 条较旧的记录,那么这很简单,但如果有 5 000 0000 条记录,其中数百万条记录看起来有点像您要插入的用户名,那么执行此检查会越来越慢。
假设您的所有数据都是可靠且一致的,您可以在移动大量数据时暂时关闭约束检查,这将加快您的写入过程。但是,如果事情不一致,那么你就会遇到问题。
您可以暂时删除所有索引,并在插入所有批次后重新创建它们。