2013-09-05 2 views
0

Резюме:Query Optimization (MySQL)

У нас есть страница продуктов и комментариев пользователей, которые могут быть или не быть на каждом продукте. Одна таблица содержит сведения о продукте (products_master), одна таблица определяет, какой продукт будет отображаться (покупка). Когда мы зацикливаем и выводим каждый продукт из запроса # 1, выполняется запрос # 2, чтобы вытягивать связанные комментарии с текущим продуктом, отображаемым из запроса # 1.

Задача: Все это работает, но это МЕДЛЕННО! Мы думаем, есть ли способ объединить это в один оптимизированный запрос, который мы можем выполнить один раз, а затем пропустить его ... или любые другие идеи, чтобы сделать это быстрее.

Запрос # 1

SELECT shoppingfeed.action_date, 
     products_master.name, 
     products_master.image_url, 
     products_master.pop_sku, 
     products_master.group_id, 
     products_master.lowest_price, 
     products_master.highest_price, 
     products_master.merchant, 
     products_master.width, 
     products_master.height 
FROM products_master, 
     shoppingfeed 
WHERE (shoppingfeed.sf_product_id = products_master.pop_sku) 
ORDER BY action_date DESC 
LIMIT #offset#, #maxrow# 

запрос # 2

SELECT DISTINCT comment, 
       comment_id, 
       comments.user_id, 
       comment_date_time, 
       comment_visibility, 
       comments.friend_user_id, 
       thread_id, 
       alias, 
       first_name, 
       last_name, 
       action_id, 
       group_id, 
       users.fb_resource_id, 
       gender, 
       acct_type, 
       ascore 
FROM comments, 
     users, 
     products_master, 
     user_relationship 
WHERE comments.sf_product_id = #feed_item.pop_sku# 
     AND comments.user_id = users.user_id 
     AND products_master.pop_sku = #feed_item.pop_sku# 
     AND ((comments.user_id = user_relationship.sf_id 
       AND user_relationship.user_id = #SESSION.user_id# 
       AND user_relationship.relationship_status = 3) 
       OR (comments.user_id = #session.user_id# 
        AND user_relationship.user_id = #SESSION.user_id# 
        AND user_relationship.relationship_status = 99)) 
ORDER BY comment_date_time ASC 

Вот вид я соединял

выберите products_master. pop_sku AS pop_sku, products_master. group_id AS group_id, products_master. name AS name, products_master. image_url AS image_url, products_master. last_updated AS last_updated, products_master. have_it_users AS have_it_users, products_master. want_it_users AS want_it_users, products_master. adults_only AS adults_only, products_master. reviewed_by AS reviewed_by, products_master. donate_needed_qty AS donate_needed_qty, products_master. inspired_users AS inspired_users, products_master. deal_users_up AS deal_users_up, products_master. deal_users_down AS deal_users_down, products_master. merchant AS merchant, products_master. merchant_logo AS merchant_logo, products_master. width AS width, products_master. height AS height, products_master. ОКС added_by, products_master. product_category_id AS product_category_id, comments. comment AS comment, comments. comment_date_time AS comment_date_time, comments. comment_visibility AS comment_visibility, comments. friend_user_id AS friend_user_id, comments. user_id AS user_id, comments. action_id AS action_id, comments.comment_id AS comment_id, shoppingfeed. action_code AS action_code, shoppingfeed. action_date AS action_date, shoppingfeed. new_friend_id AS new_friend_id, shoppingfeed. question_id AS question_id, users. first_name AS first_name, users. last_name AS last_name, users. shopping_clout AS shopping_clout, users. gender AS gender, users. fb_resource_id AS fb_resource_id, comments. thread_id AS thread_id, users. wish_qty AS wish_qty, merchants. logo AS logo, merchants. companyname AS companyname, product_relationship. desirability А.С. desirability из (((((products_master присоединиться к shoppingfeed на ((products_master. pop_sku = shoppingfeed. sf_product_id))) присоединиться к comments на ((products_master. pop_sku = comments. sf_product_id))) присоединиться к users на (((comments. user_id = users. user_id) и (comments. user_id = shoppingfeed. user_id)))) присоединиться к product_relationship на ((product_relationship. user_id = users. user_id))) присоединиться к merchants на (((products_master. merchant = merchants. merchantid) и (product_relationship. sf_product_id = products_master. pop_sku)))) заказ по comments. comment_date_time

+1

Что происходит, когда вы пытаетесь запустить его как один запрос? Кроме того, чтобы помочь настроить его, нам понадобится вывод SHOW CREATE TABLE и EXPLAIN. –

+0

Я не эксперт, я создал представление, и это кажется намного быстрее ... Я уверен, что это не идеально. Посмотрите выше для представления, которое я собрал. – user1322114

+0

Если вы хотите, чтобы мы помогли оптимизировать запрос, ** вам нужно показать нам определения таблиц и индексов **, а также количество строк для каждой из таблиц. Возможно, ваши таблицы плохо определены. Возможно, индексы создаются неправильно. Возможно, у вас нет указателя на тот столбец, который, как вы думали, вы делали.Не видя определения таблиц и индексов, мы не можем сказать. Нам также нужны подсчет строк, потому что это может сильно повлиять на оптимизацию запросов. Если вы знаете, как сделать «EXPLAIN» или получить план выполнения, поместите результаты в вопрос. –

ответ

1
  1. пытаются использовать «внутреннее соединение» или «влево/вправо присоединиться к» вместо условий «где» пункт
  2. проверить ваш первичный ключ и внешний ключ, чтобы добавить их к столбцам таблицы, если они больше относится в таблице соединения
  3. создать индекс для столбцов таблицы, если они относятся больше присоединиться к таблице (на самом деле, внешний ключ является одним из индекса)
0

Я добавил несколько индексов, и сделал вид, в настоящее время все готово. Я собираюсь экспериментировать с еще несколькими индексами, чтобы сделать это еще быстрее, но сейчас я счастливый турист.