Railsはクエリの遅さを選択する

私は理解できない、レールの問題が少しあります。

ローカルでは、Mongrelを使ってrails 3.1とruby 1.9.3を実行しています。私はPassanger/Apache2を実行しています。開発環境では、ローカルで実行している間に、私のDBクエリは約40〜50秒かかっています。製品テーブルには約15,000レコード、プレイルームには5,000テーブル、collection_itemには1,700レコードがあります。レールがこれらのテーブル全体に対して選択を行っているように見えますが、これは減速の原因となります。

私のモデル構造の概要を次に示します。

Collection
-- has_many CollectionItems

CollectionItem
-- belongs_to Collection
-- has_many Products
-- has_many Playrooms

Product
-- has_many LineItems
-- belongs_to ProductType
-- belongs_to CollectionItem

Cart
-- has_many LineItems

LineItem
-- belongs_to Product
-- belongs_to Order
-- belongs_to Cart

Here's my log:

Processing by CartController#index as HTML
Cart Load (0.7ms)  SELECT `carts`.* FROM `carts` WHERE `carts`.`id` = 7 LIMIT 1
CollectionGroup Load (1.6ms)  SELECT `collection_groups`.* FROM `collection_groups` WHERE (status = 'live')
Rendered cart/_checkout_steps.html.erb (1.2ms)
(0.4ms)  SELECT COUNT(*) FROM `line_items` WHERE `line_items`.`cart_id` = 7
LineItem Load (2.0ms)  SELECT `line_items`.* FROM `line_items` WHERE `line_items`.`cart_id` = 7
Product Load (33592.3ms)  SELECT `products`.* FROM `products` 
Product Load (1.8ms)  SELECT `products`.* FROM `products` WHERE `products`.`id` = 1 LIMIT 1
ProductType Load (181.5ms)  SELECT `product_types`.* FROM `product_types` 
[paperclip] Duplicate URL for image with /system/:attachment/:id/:style/:filename. This will clash with attachment defined in CollectionItem class
ProductType Load (1.5ms)  SELECT `product_types`.* FROM `product_types` WHERE `product_types`.`id` = 1 LIMIT 1
CollectionItem Load (**4701.0ms**)  SELECT `collection_items`.* FROM `collection_items` 
[paperclip] Duplicate URL for image with /system/:attachment/:id/:style/:filename. This will clash with attachment defined in ProductType class
Collection Load (157.8ms)  SELECT `collections`.* FROM `collections` 
Playroom Load (18056.7ms)  SELECT `playrooms`.* FROM `playrooms` 
CollectionItem Load (1.0ms)  SELECT `collection_items`.* FROM `collection_items` WHERE `collection_items`.`id` = 1 LIMIT 1
Product Load (1.0ms)  SELECT `products`.* FROM `products` WHERE `products`.`id` = 527 LIMIT 1
ProductType Load (1.0ms)  SELECT `product_types`.* FROM `product_types` WHERE `product_types`.`id` = 5 LIMIT 1
CollectionItem Load (0.8ms)  SELECT `collection_items`.* FROM `collection_items` WHERE `collection_items`.`id` = 31 LIMIT 1
Product Load (0.8ms)  SELECT `products`.* FROM `products` WHERE `products`.`id` = 11 LIMIT 1
ProductType Load (0.7ms)  SELECT `product_types`.* FROM `product_types` WHERE `product_types`.`id` = 2 LIMIT 1
CollectionItem Load (1.1ms)  SELECT `collection_items`.* FROM `collection_items` WHERE `collection_items`.`id` = 2 LIMIT 1
Product Load (1.0ms)  SELECT `products`.* FROM `products` WHERE `products`.`id` = 2 LIMIT 1
CACHE (0.0ms)  SELECT `product_types`.* FROM `product_types` WHERE `product_types`.`id` = 1 LIMIT 1
CACHE (0.0ms)  SELECT `collection_items`.* FROM `collection_items` WHERE `collection_items`.`id` = 1 LIMIT 1

これを生成するコードブロックは次のとおりです:

<% @cart.line_items.each do |line_item| %>
line_item.product.product_type.title

問題はサイト全体で発生していますが、関係を設定した方法に関係していると思います。私は、Railsが製品、プレイルーム、collection_itemsの全テーブルを選択しようとしている理由を特定できません(これは45秒を要します)

また、外部キーのインデックス設定もあります。

どんな考えやアドバイスも感謝します。

0
レールがテーブル全体をロードしようとしているのは疑いがあります。それはそれを引き起こすこれらの行ですか?
追加された 著者 phoet,
何かがあなたを殺しているすべての製品をロードしようとしているようです(1つのクエリで33秒)。そして、私はあなたが提供したスニペットから少なくともそれらのオブジェクトのどれもロードしてはならないにもかかわらず、その行のコードがロードされているにもかかわらず、すべてのPlayroomがロードされているのを見ています。 LineItemクラスのコードを確認すると便利です。
追加された 著者 siannopollo,
はい、それは奇妙なので、私はそれがbelongs_to/has_many参照と関係があると考えているのです。それは、最初に別のテーブル参照を検出したときに結果を見つけるためにテーブル全体を照会するように見えます。私は本当に困った!
追加された 著者 Rory_MacDonald,

答えはありません

0