【发布时间】:2009-10-21 18:00:00
【问题描述】:
我可以设置 rails 使用带有 MEMORY 的 mysql 作为数据库引擎吗?我从不重新启动mysql,并且经常重建数据库,我宁愿让它快点。拥有用于运行测试的内存数据库也很好。
编辑:我应该指定这仅用于开发/测试,而不是生产。
【问题讨论】:
标签: mysql ruby-on-rails memory
我可以设置 rails 使用带有 MEMORY 的 mysql 作为数据库引擎吗?我从不重新启动mysql,并且经常重建数据库,我宁愿让它快点。拥有用于运行测试的内存数据库也很好。
编辑:我应该指定这仅用于开发/测试,而不是生产。
【问题讨论】:
标签: mysql ruby-on-rails memory
我不明白你为什么不能;您选择的存储引擎是 MySQL 实现细节。您只需在迁移的 create_table 声明中设置 :options => "ENGINE=MEMORY"。
当然,我也不明白你为什么会——尤其是在生产中。 MEMORY 引擎的 MySQL 文档是 full of caveats,就像固定长度的字段分配一样,与丢失所有内容的风险相比,您实现的速度提升必须是微不足道的。如果您的应用程序不需要持久化任何东西,为什么不完全跳过 ActiveRecord 并将您的模型分层到 Memcached 之上?
【讨论】:
:options => (RAILS_ENV != 'production' ? "ENGINE=MEMORY" : nil)(请确保您的测试不会被仅存在于内存引擎中的一些怪异所影响。就我个人而言,我仍然不会为此烦恼;但如果您真的认为数据库速度是您的测试瓶颈,请自责出来。)
我在内存数据库中使用 sqlite3 进行测试。它通常比基于文件的速度快一点,但除非你有大量的测试数据,否则不会那么快。
要设置它,您的 database.yml 将如下所示:
test:
adapter: sqlite3
database: ":memory:"
您还必须在测试助手中将架构加载到内存数据库中,如下所示:
config = YAML::load(IO.read(File.dirname(__FILE__) + "/../config/database.yml"))
ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + "/../log/debug.log")
ActiveRecord::Base.establish_connection(config["test"])
load(File.dirname(__FILE__) + "/../db/schema.rb")
【讨论】:
出于测试目的考虑使用https://github.com/mvz/memory_test_fix 插件。它的使用就像更新database.yml 和运行一样简单
rails plugin install git://github.com/mvz/memory_test_fix.git
您也可以尝试安装 memory_test_fix gem,但它来自不同的 git 分支,不支持 Rails 3。
gem 帮助我将测试用例的执行时间从 25 秒减少到 19 秒。另一方面,它在数据库模式初始化上引入了 2 秒的开销(我没有那么多)。因此,在小型测试集上,不值得打扰。
杰森·斯图尔特回答的解决方案基本相同。我用它代替了插件,因为它更容易与Spork插件结合。
【讨论】: