【问题标题】:MySQL multiple insert performanceMySQL 多次插入性能
【发布时间】:2011-12-20 02:26:25
【问题描述】:

我的数据包含大约 30 000 条记录。我需要将这些数据插入到 MySQL 表中。我将这些数据按 1000 分组并创建多个插入,如下所示:

INSERT INTO `table_name` VALUES (data1), (data2), ..., (data1000);

如何优化此插入的性能?我可以每次插入超过 1000 条记录吗?每行包含大小约为 1KB 的数据。谢谢。

【问题讨论】:

    标签: mysql sql performance insert


    【解决方案1】:

    尝试将批量插入包装在事务中。

    START TRANSACTION
    INSERT INTO `table_name` VALUES (data1), (data2), ..., (data1000);
    COMMIT
    

    这可能会提高性能,但我不确定 mySQL 是否可以部分提交批量插入(如果不能,那么这可能不会有太大帮助)

    请记住,即使在 1.5 秒内,对于 30,000 条记录,每条记录的大小约为 1k,您的提交速度为 20MB/s,您实际上可能会受到驱动器限制,具体取决于您的硬件设置。

    那么建议是调查 SSD 或更改您的 Raid 设置或获得更快的机械驱动器(网上有大量关于使用安装在 SSD 上的 SQL 数据库的利弊的在线文章)。

    【讨论】:

    • 在事务主体中封装一个大容量 insert 循环可以显着减少磁盘 I/O 的数量,并加快使用 InnoDB 和廉价 PATA 磁盘对我的数据库的操作。我很想知道这个“技巧”是否可靠且便携。这是在 MySQL 5.6 和 Linux 2.6.32 上。
    • 此方法非常可靠且可移植,因为在内部所有没有事务的插入操作都会创建和提交单个事务,这会导致大量 I/O 开销。这种方法显着提高了几乎每个关系数据库的性能,与不使用事务的唯一区别是整个插入将回滚或提交,而不是允许一些插入提交而其他插入失败。
    • 这对我帮助很大。我正在做 100 个块(每个 GET 请求的最大 api 记录)INSERT INTO... ON DUPLICATE KEY UPDATE... 使用 $mysqli->multi_query() 来处理 123k 条记录需要 2.30 小时,用事务和包装每个块所有 123k 条记录需要 20 分钟。我很高兴地去吃午饭。
    • 合并事务(innoDB)和批量插入怎么样?这不是最快的选择吗?
    【解决方案2】:

    您需要检查 mysql 服务器配置,并专门检查缓冲区大小等。

    您可以从表中删除索引(如果有),以使其更快。一旦有数据就创建索引。

    看这里,你应该得到你需要的一切。

    http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html

    它说,一个具有多个值的插入语句比多个插入语句快得多。

    【讨论】:

    • 谢谢。但是表就是这么简单。它没有索引。并且有类型 MyISAM
    【解决方案3】:

    这是一次性操作吗?

    如果是这样,只需为每个数据元素生成一个 sql 语句并在服务器上执行它们。 30,000 确实不应该花费很长时间,您将拥有输入数据的最简单方法。

    【讨论】:

    • 所有记录插入成功。但这需要将近1.5秒。我需要减少这个时间。
    • 1.5 秒插入 30000 条记录在我的书中相当不错。只需显示一个旋转计时器并等待。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 2016-08-13
    • 2023-03-27
    • 2015-05-02
    • 1970-01-01
    相关资源
    最近更新 更多