我在Linux机器上安装了MySQL 5.1x实例(768MB RAM)。我恢复了大约1000行的备份,并通过我的.NET应用程序(部署在不同的Windows Web服务器上)执行了某些读取操作,当考虑到表没有索引时,它很快。
然后我从这些行中清除了服务器,并在其他服务器上的Web应用程序中使用了一个功能来插入行(基本上,我从文本文件中读取文本,将数据输入到自定义类的字段中,然后调用每个记录都有这些参数的存储过程。当我在我的本地机器上有网站和数据库时,我会立即插入2500行(不到一秒钟)。然而,现在,在“生产”环境中,这些相同的2500行需要插入10分钟。我正在使用MySQL安装附带的默认my.cnf。
有没有什么办法可以在不影响读取操作速度的情况下优化写入?或者我错过了一些明显的东西?
提前致谢!
答案 0 :(得分:2)
你看过the MySQL manual page for insert speed了吗?我想到的第一个猜测是你没有在Begin Transaction/Commit语句中包含2500个过程的集合,因此MySQL会自动提交2500个动作中的每一个。
答案 1 :(得分:1)
除了Mark提到的问题(自动提交而不是事务),我肯定会调查使用批量更新。因为本地连接和网络连接(即使是非常快的连接)之间的一个主要区别是往返时间。
虽然在这种情况下带宽很可能不是限制因素,但对网络进行2500次网络往返并返回网络肯定会比在本地计算机上花费更长的时间。
使用批量更新可以在理想情况下将这些插入减少到单个往返,而在实践中只减少一些。
不幸的是,我不能告诉你如何在.NET世界中进行那些批量更新,用Java PreparedStatement.addBatch()
。我确信在.NET中有类似的东西。