2010-09-23 3 views
0

У меня есть сложный SQL запрос с вложенными «подзапросами», что я хочу, чтобы оптимизироватьнужна помощь оптимизации MySQL запроса

SELECT 
'likes' `type`, 
entry_date item_date, 
CASE `type` 
    WHEN 'entry_id' THEN entry_id 
    WHEN 'member_id' THEN f.member_id 
    WHEN 'topic_id' THEN entry_id 
END  
AS item_id, 
CASE `type` 
    WHEN 'entry_id' THEN (SELECT title FROM exp_weblog_titles WHERE entry_id=item_id) 
    WHEN 'member_id' THEN (SELECT screen_name FROM exp_members WHERE member_id=item_id) 
    WHEN 'topic_id' THEN (SELECT title FROM exp_forum_topics WHERE topic_id=item_id) 
END  
AS item_title, 
CASE `type` 
    WHEN 'member_id' THEN (SELECT username FROM exp_members WHERE member_id=item_id) 
    ELSE '' 
END  
AS item_url_title, 
f.type parent_type, 
CASE `type` 
    WHEN 'entry_id' THEN (SELECT weblog_id FROM exp_weblog_titles WHERE entry_id=item_id) 
    WHEN 'member_id' THEN '' 
    WHEN 'topic_id' THEN (SELECT forum_id FROM exp_forum_topics WHERE topic_id=item_id) 
END  
AS parent_id, 
CASE `type` 
    WHEN 'entry_id' THEN '' 
    WHEN 'member_id' THEN '' 
    WHEN 'topic_id' THEN (SELECT forum_name FROM exp_forums WHERE forum_id=parent_id) 
END  
AS parent_title,   
m.member_id actor_member_id, 
screen_name actor_screen_name, 
username actor_username, 
photo_filename actor_photo, 
avatar_filename actor_avatar 
FROM exp_favorites f, exp_members m 
WHERE f.member_id=m.member_id 

Как вы можете заметить, в подзапросах некоторых таблицы опрашиваются несколько раз для одной и той же строки, но другое поле.
Мол, у меня есть

SELECT screen_name FROM exp_members WHERE member_id=item_id 

и

SELECT username FROM exp_members WHERE member_id=item_id 

который я доживу до сочетании с mimize количество reuests и нагрузки на сервер.

Есть ли способ сделать это? Какие-нибудь советы?

UPD. Структура таблицы выглядит следующим образом:
CREATE TABLE exp_favorites (
favorites_id INT (10) без знака NOT NULL AUTO_INCREMENT,
type VARCHAR (16) NOT NULL по умолчанию 'entry_id',
author_id INT (10) без знака NOT NULL по умолчанию «0 »,
entry_id INT (10) без знака NOT NULL, то
member_id INT (10) NOT NULL без знака,
site_id SMALLINT (3) без знака NOT NULL по умолчанию '1',
entry_date INT (10) ип подписал NOT NULL,
notes текст NOT NULL,
public полукокса (1) NOT NULL по умолчанию 'у',
PRIMARY KEY (favorites_id)
KEY author_id (author_id)
KEY entry_id (entry_id),
КЛЮЧ member_id (member_id),
КЛЮЧ site_id (site_id),
КЛЮЧ public (public),
KEY type (type)
)

+0

Вы можете оставить структуру таблицы здесь? Нормализована ли ваша база данных? –

+0

обновил сообщение с информацией о структуре таблицы. Я не очень разбираюсь в нормализации, но мне кажется, что это нормально. –

ответ

1

Вы можете сделать что-то вроде этого:

SELECT 
'likes' `type`, 
entry_date item_date, 
CASE `type` 
    WHEN 'entry_id' THEN entry_id 
    WHEN 'member_id' THEN f.member_id 
    WHEN 'topic_id' THEN entry_id 
END  
AS item_id, 
CASE `type` 
    WHEN 'entry_id' THEN wt.title 
    WHEN 'member_id' THEN m2.screen_name 
    WHEN 'topic_id' THEN ft.title 
END  
AS item_title, 
... 
FROM exp_favorites f 
inner join exp_members m ON f.member_id=m.member_id 
left outer join exp_weblog_titles wt on wt.entry_id=f.item_id 
left outer join exp_members m2 on m2.entry_id=f.item_id 
left outer join exp_forum_topics ft on ft.entry_id=f.item_id 
+0

он не выглядит так, как f.item_id может относиться к записи в любой из трех таблиц, и, таким образом, соединение станет просто огромным. Или я здесь не прав? –

+0

@runner: посмотрите условия соединения в последних трех табличных объединениях - все они от f.item_id до соответствующего поля в каждой таблице. –

+0

@RedFilter, я думаю, что пара этих левых объединений должна быть изменена - exp_members только присоединяется к member_id, поэтому нет необходимости в m2, в то время как тема форума связана с topic_id и parent_id, но не с entry_id. –

Смежные вопросы