ActiveRecord为与has_and_belongs_to_many的MySQL关系生成昂贵的DESCRIBE查询

时间:2011-03-19 19:57:54

标签: mysql ruby-on-rails performance activerecord

我们刚开始开发Rails3应用程序。我们在两个模型之间使用has_and_belongs_to_many关系。每次我们使用其中一个模型时,ActiveRecord就会在连接表上执行DESCRIBE查询,例如:

SQL (1.1ms)  describe `articles_tags`

这些查询相对昂贵(也就是说,比实际的SELECT查询慢10倍以上)并且经常执行。它们对我来说似乎没有必要:因为has_and_belongs_to_many-relation而自动生成表,所以ActiveRecord应该已经知道它的结构(只是一个article_id和一个tag_id列)。

这种行为有充分的理由吗?如果没有,我该如何阻止它发生?

2 个答案:

答案 0 :(得分:4)

在开发模式下,服务器会不断重新创建所有类,因此您无需为每次更改重新启动服务器。在生产中,您的模型将被缓存,不应该不断地描述表格。在您的development.rb文件中,您将看到以下行:

config.cache_classes = false

这会导致此行为。它应该在production.rb

中设置为true

答案 1 :(得分:1)

如果您的表没有主键,它将在每个查询上运行describe。我修复了我添加主键的问题。即使在开发模式下也能正常工作。