我正在使用我的本地计算机上的MySQL数据库的Ruby on Rails 3.2应用程序。为了测试我添加的一些新功能,我编写了一个脚本来手动将大约50,000条记录插入到数据库中。到目前为止,非常好。
在添加这些记录后,我第一次使用新功能加载页面时,Rails会加载每个记录,然后一次更新一个记录。这就是我的日志文件:
(0.1ms) BEGIN
MyModel Exists (0.3ms) SELECT 1 AS one FROM `my_models` WHERE `my_models`.`part_id` = BINARY 1 LIMIT 1
SQL (0.1ms) INSERT INTO `my_models` (`answer_date_time`, `call_date_time`, `caller_id`, `part_id`, `created_at`, `destination`, `employee_id`, `end_date_time`, `length`, `part_user_id`, `price`, `routing`, `source`, `updated_at`) VALUES (NULL, '2013-06-28 13:12:06', NULL, 1, '2013-06-28 13:12:06', NULL, 4, NULL, NULL, NULL, NULL, 'incoming', NULL, '2013-06-28 13:12:06')
(52.6ms) COMMIT
(0.0ms) BEGIN
MyModel Exists (0.2ms) SELECT 1 AS one FROM `my_models` WHERE `my_models`.`part_id` = BINARY 2 LIMIT 1
SQL (0.2ms) INSERT INTO `my_models` (`answer_date_time`, `call_date_time`, `caller_id`, `part_id`, `created_at`, `destination`, `employee_id`, `end_date_time`, `length`, `part_user_id`, `price`, `routing`, `source`, `updated_at`) VALUES (NULL, '2013-06-28 13:12:06', NULL, 2, '2013-06-28 13:12:06', NULL, 4, NULL, NULL, NULL, NULL, 'outgoing', NULL, '2013-06-28 13:12:06')
(70.4ms) COMMIT
依此类推,所有50,000多条记录。花了几分钟才完成。尽管如此,我已经尝试多次重新加载有问题的页面,并且Rails没有再次运行这些查询。
这看起来很正常吗? Rails偶尔需要“捅”一次这样的新记录,然后让它们独自一人吗?或者我的代码看起来有什么问题会导致性能问题?
如果存在潜在问题,我很遗憾不熟悉Rails,而且我从其他人那里继承了这个应用程序。我应该从哪里开始寻找会产生这种行为的代码?
编辑:这是MyModel的定义。我不知道评论意味着什么...
class MyModel < ActiveRecord::Base
# This model is :dependent => :delete elsewhere
# so no :dependents or before/after destroy callbacks without changing other models!
belongs_to :employee
validates_uniqueness_of :parts_id
# snip - class and instance methods
end
编辑2:这是我将记录添加到数据库的方式:
我编写了一个看起来像这样的Ruby脚本create_db_data.rb
(这不是真正的脚本,因为我不想分享我公司的代码,但它的工作方式几乎完全相同):
n = 0
for employee in Employee
for i in (1..10000)
obj = MyModel.new
obj.employee_id = employee.id
obj.answer_date_time = Date.today - i
n += 1
obj.part_id = n
obj.save
end
end
然后我从命令行执行rails r create_db_data.rb
。在此之后,下次我尝试从我的开发机器上的应用程序加载页面时,Rails执行了我正在询问的奇怪查询--Rails没有做任何事情 as 我添加了记录,但之后。
答案 0 :(得分:0)
我最好的猜测是它与validates_uniqueness_of parts_id
定义中的MyModel
行有关。根据{{3}},
创建[a]记录[使用
validates_uniqueness_of parts_id
]时,会执行检查以确保没有 记录存在于数据库中,具有指定的给定值 attribute(映射到列)。当记录更新时, 进行同样的检查,但无视记录本身。
我的猜测是,由于我使用rails r
添加了记录而没有正确启动服务器,因此Rails仍然希望在我第一次实际使用Web应用程序中的记录时执行检查。