我正在本地机器上使用 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 在我添加记录时没有做任何事情,但是之后。