【问题标题】:Faster way to concurrently insert data into MySQL将数据同时插入 MySQL 的更快方法
【发布时间】:2012-12-20 15:13:20
【问题描述】:

我有一个包含大约 64 个子进程的并行进程,每个子进程都需要将数据插入到登陆表中。我目前正在使用 MySQL MyISAM 引擎,并且在插入之前和之后禁用键。

但是,这似乎是我过程中的一个巨大瓶颈。我相信 MySQL 是每次插入的表锁定,因此进程一直在等待写入。

插入是独立的,不存在插入冲突的危险。这也不需要交易或任何类似性质的东西。

是否有不同的引擎,或提高 MySQL 插入/写入性能的方法?

我曾想过为每个进程实例化一个表,但这会使代码更复杂,这不是我真正的风格....

任何建议将不胜感激。

谢谢!

【问题讨论】:

    标签: mysql performance insert parallel-processing


    【解决方案1】:

    INSERT DELAYED Syntax 中所述:

    INSERT 语句的 DELAYED 选项是标准 SQL 的 MySQL 扩展,如果您的客户端不能或不需要等待 INSERT 完成,这将非常有用。

    [ deletia ]

    使用INSERT DELAYED 的另一个主要好处是来自许多客户端的插入被捆绑在一起并写在一个块中。这比执行许多单独的插入要快得多。

    【讨论】:

    • 是的,我在考虑这个,但我担心处理机器和服务器是同一台机器。使用 Insert Delayed 时,MySQL 究竟在哪里保存数据? RAM,交换,磁盘?我已经与正在处理的孩子一起运行非常接近 RAM 限制......谢谢!
    • @user1459544: "排队的行只保存在内存中,直到它们被插入到表中。" -- 当然,O/S 将交换到虚拟内存根据需要 - 但如果您的 RAM 不足,则可能值得再投资一些。
    • 我认为这台机器的容量为 256GB,但让我们试一试,我会告诉你结果如何。也许如果它可以更快地进入数据库,我的孩子们会更快地释放他们的 RAM 资源,并为所有人带来美好时光。
    • @user1459544:听起来是时候考虑将 MySQL 服务器移到另一台机器上了。
    • @user1459544:听起来可能是时候考虑将管理层(或您自己)转移到另一份工作了。 ;)
    【解决方案2】:

    MyISAM 在插入、更新或删除时确实会锁定表。 InnoDB 允许事务和基于行的锁。

    您还可以查看LOAD DATA INFILE,这对于批量插入来说更快。

    【讨论】:

    • InnoDB 仍将执行下一行锁定,其他插入必须等待释放。可悲的是,LOAD DATA INFILE 在这里也没有多大用处,因为没有“批量插入”,而是来自不同客户的大量单独插入。
    • 我可以将插入内容通过管道传输到文本中,甚至可以使用 cat 创建单个大文件,但这不是 IMO 的最佳选择,因为它增加了更多的处理层。我可以将其用作最后的手段,但我希望可以对 MySQL 进行一些调整以避免额外的步骤……或者让 64 个孩子同时尝试写出……
    • 也许您可以为每个进程创建表并在所有子进程完成后合并到主表中?
    猜你喜欢
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    相关资源
    最近更新 更多