Ruby:使用Fibers会增加我的数据库插入吞吐量吗?

时间:2010-04-25 01:36:56

标签: mysql ruby multithreading

目前我正在使用Ruby 1.9.1和'ruby-mysql'gem,它与'mysql'gem不同,只是用ruby编写的。实际上这很慢,因为它似乎以几乎每秒1的速率插入(SLOOOOOWWWWWW)。而且我也有很多插件,它几乎就是这个脚本所做的最直接的。我只使用1个连接(因为我只使用一个线程)。我希望通过创造一种

光纤来加快速度
  1. 创建新的数据库连接
  2. 插入1-3条记录
  3. 关闭数据库连接
  4. 我认为启动20-50这些会大大增加数据库吞吐量。我是否正确走这条路?我认为这是最好的选择,而不是重构我的所有数据库代码,因为默认的mysql驱动程序的语法有点不同:(

2 个答案:

答案 0 :(得分:0)

为什么在几次插入后关闭连接?你的脚本应该是:

  1. 打开连接
  2. 写下你需要的许多记录
  3. 关闭连接
  4. 交易会使这一点复杂化。

    如果您正在进行非事务性插入,请绝对使用一个连接并一次写入一条记录。

    如果您正在使用事务并编写一个真正庞大的数据集(即数百万行),那么您的数据库可能需要进行调整,以便它有足够的临时存储来处理它。

    基本上,如果单个插页需要一秒钟,它会向我建议一个或多个:

    1. 您的外键未编入索引,因此对插入的参照完整性检查非常低效;或
    2. 连接断开和关闭过多。
    3. 现在所说的是,让多个“工人”进行插入可以导致整体吞吐量的有用增加,但每次插入1秒,这不是你的问题。你需要找到你的问题。

      使用真正庞大的批量插入,也可能值得禁用检查约束,外键和索引,执行所有插入操作然后重新启用它们。

答案 1 :(得分:0)

由于您使用的是ruby1.9.1,因此只需使用Threads。它们不再是绿色的。光纤无法提供帮助,因为它们对于多个并发数据库连接而言重量太轻。