Rails выбирает медлительность запроса - PullRequest
0 голосов
/ 06 февраля 2012

У меня небольшая проблема с рельсами, которую я не могу понять.

Локально я использую rails 3.1 и ruby ​​1.9.3, используя Mongrel, на производстве я использую Passanger / Apache2. Хотя локально, в среде разработки, мои запросы к БД занимают около 40-50 секунд, что очень много. У нас около 15 000 записей в таблице продуктов, 5000 в игровой комнате и 1700 в collection_items, и кажется, что rails делает выбор по всем этим столам, что вызывает замедление.

Вот обзор структуры моей модели:

Коллекция
- has_many CollectionItems

CollectionItem
- принадлежит коллекции
- has_many Продукты
- has_many игровые комнаты

Продукт
- has_many LineItems
- принадлежит_Типу продукта
- принадлежит CollectionItem

Корзина
- has_many LineItems

LineItem
- принадлежит_продукту
- принадлежит_заказ
- принадлежит_Карта

Вот мой журнал:

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 секунд)

Также у нас есть настройка индексации по внешним ключам.

Будем благодарны за любые мысли или советы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...