ローカル マシンで MySQL データベースを使用する Ruby on Rails 3.2 アプリに取り組んでいます。追加した新しい機能をテストするために、データベースに約 50,000 レコードを手動で挿入するスクリプトを作成しました。ここまでは順調ですね。
これらのレコードを追加した後、新しい機能を含むページを初めてロードしたとき、Rails は各レコードをロードしてから、一度に 1 つずつ更新しました。これは私のログファイルがどのように見えるかです:
(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 は私が求めている奇妙なクエリを実行しました。