【问题标题】:MySQL "inserts" speed difference between production and local environment is too big!MySQL“插入”生产和本地环境的速度差异太大了!
【发布时间】:2009-07-03 08:10:39
【问题描述】:

我在 Linux 机器(768MB RAM)上安装了 MySQL 5.1x 实例。我恢复了大约 1000 行的备份,并通过我的 .NET 应用程序(部署在不同的 Windows 网络服务器上)执行了某些读取操作,考虑到表没有索引,这些操作速度很快。

然后,我从这些行中清除了服务器,并在另一台服务器上的 Web 应用程序中使用了一个功能来插入行(基本上,我从文本文件中读取文本,将数据输入到自定义类的字段中,然后调用每个记录都有这些参数的存储过程)。当我在本地机器上同时拥有网站和数据库时,我会立即插入 2500 行(不到一秒)。然而,现在,在“生产”环境中,插入这些相同的 2500 行需要 10 分钟。我使用的是 MySQL 安装自带的默认 my.cnf。

有什么方法可以优化写入而不影响读取操作的速度?还是我遗漏了一些明显的东西?

提前致谢!

【问题讨论】:

    标签: mysql stored-procedures insert performance production


    【解决方案1】:

    你看过the MySQL manual page for insert speed吗?我想到的第一个猜测是您没有将这组 2500 个过程包装在 Begin Transaction/Commit 语句中,因此 MySQL 会自动提交 2500 个操作中的每一个。

    【讨论】:

    • 嗨,马克,感谢您的回复...我已经阅读了有关自动提交的信息,但只是简短地阅读并认为它只与 InnoDB 表有关。 (我正在使用 MyISAM)。但是您给了我一个想法,与其重复执行存储过程,不如将调用写入文本文件,例如 CALL sp(A,B); CALL sp(C,D) 等,然后我通过查询浏览器一次执行它们。大概,(如果我将它们包装在 Begin Transaction 中),这应该快得多?!谢谢!
    • 我希望它会明显更快。它不会每次都自动提交,也不会像@Joachim 所说的那样重复建立单独的连接。让我们知道进展如何。
    【解决方案2】:

    除了 Mark 提到的问题(自动提交而不是事务),我肯定会使用批量更新进行调查。因为本地连接和网络连接(即使是非常快的连接)之间的一个主要区别是往返时间。

    虽然在这种情况下带宽很可能不是限制因素,但在网络上执行 2500 次往返数据库的网络往返肯定会比在本地计算机上花费更长的时间。

    理想情况下,使用批量更新可以将这些插入减少到一次往返,而在实践中只需几次。

    不幸的是,我无法告诉您如何在 .NET 世界中进行这些批量更新,在 Java 中您会使用 PreparedStatement.addBatch()。我确信 .NET 中也有类似的东西。

    【讨论】:

    • 感谢约阿希姆的回答。但是,如果我使用 DataSet 而不是 MySqlCommand 对象,我认为我可以在 .NET 中使用 BatchUpdate。
    猜你喜欢
    • 2019-04-22
    • 1970-01-01
    • 2012-08-04
    • 2015-07-07
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多