Резюме: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
ASpop_sku
,products_master
.group_id
ASgroup_id
,products_master
.name
ASname
,products_master
.image_url
ASimage_url
,products_master
.last_updated
ASlast_updated
,products_master
.have_it_users
AShave_it_users
,products_master
.want_it_users
ASwant_it_users
,products_master
.adults_only
ASadults_only
,products_master
.reviewed_by
ASreviewed_by
,products_master
.donate_needed_qty
ASdonate_needed_qty
,products_master
.inspired_users
ASinspired_users
,products_master
.deal_users_up
ASdeal_users_up
,products_master
.deal_users_down
ASdeal_users_down
,products_master
.merchant
ASmerchant
,products_master
.merchant_logo
ASmerchant_logo
,products_master
.width
ASwidth
,products_master
.height
ASheight
,products_master
. ОКСadded_by
,products_master
.product_category_id
ASproduct_category_id
,comments
.comment
AScomment
,comments
.comment_date_time
AScomment_date_time
,comments
.comment_visibility
AScomment_visibility
,comments
.friend_user_id
ASfriend_user_id
,comments
.user_id
ASuser_id
,comments
.action_id
ASaction_id
,comments
.comment_id
AScomment_id
,shoppingfeed
.action_code
ASaction_code
,shoppingfeed
.action_date
ASaction_date
,shoppingfeed
.new_friend_id
ASnew_friend_id
,shoppingfeed
.question_id
ASquestion_id
,users
.first_name
ASfirst_name
,users
.last_name
ASlast_name
,users
.shopping_clout
ASshopping_clout
,users
.gender
ASgender
,users
.fb_resource_id
ASfb_resource_id
,comments
.thread_id
ASthread_id
,users
.wish_qty
ASwish_qty
,merchants
.logo
ASlogo
,merchants
.companyname
AScompanyname
,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
Что происходит, когда вы пытаетесь запустить его как один запрос? Кроме того, чтобы помочь настроить его, нам понадобится вывод SHOW CREATE TABLE и EXPLAIN. –
Я не эксперт, я создал представление, и это кажется намного быстрее ... Я уверен, что это не идеально. Посмотрите выше для представления, которое я собрал. – user1322114
Если вы хотите, чтобы мы помогли оптимизировать запрос, ** вам нужно показать нам определения таблиц и индексов **, а также количество строк для каждой из таблиц. Возможно, ваши таблицы плохо определены. Возможно, индексы создаются неправильно. Возможно, у вас нет указателя на тот столбец, который, как вы думали, вы делали.Не видя определения таблиц и индексов, мы не можем сказать. Нам также нужны подсчет строк, потому что это может сильно повлиять на оптимизацию запросов. Если вы знаете, как сделать «EXPLAIN» или получить план выполнения, поместите результаты в вопрос. –