Mysql服务器上亿条记录的大表如何优化数据插入

问题描述 投票:0回答:1

我有一个表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

我正在使用插入批量大小。前几批速度非常快,但随后就变慢了。我默认使用的批量大小是 10,000 条记录。我认为问题可能是由于数据库死锁或表锁定造成的。如果有人有经验,请帮我提供一个优化插入过程的解决方案。

你能帮我优化上面的查询吗?或者你能为我分享一些向大表插入数据的解决方案吗

mysql database mysql-python
1个回答
0
投票

如果您有一个没有约束的表,那么插入后续批次(理论上)不应比第一批慢很多。因此,您遇到相反情况的事实意味着表中存在约束,例如唯一约束、检查约束、触发器、键、索引和主键。所有这些都会为您的插入添加检查。假设您有一个唯一的用户名。为了确保它保持唯一,每次插入记录时,系统都需要检查它是否仍然是唯一的。如果有 5 条较旧的记录,那么这很简单,但如果有 5 000 0000 条记录,其中数百万条记录看起来有点像您要插入的用户名,那么执行此检查会越来越慢。

假设您的所有数据都是可靠且一致的,您可以在移动大量数据时暂时关闭约束检查,这将加快您的写入过程。但是,如果事情不一致,那么你就会遇到问题。

您可以暂时禁用外键约束

您可以暂时删除所有索引,并在插入所有批次后重新创建它们。

© www.soinside.com 2019 - 2024. All rights reserved.