нужна помощь в оптимизации запроса MySQL

0

У меня сложный SQL-запрос с вложенными "подзапросами", который я хочу оптимизировать

    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  

который я ожидал бы, чтобы объединить, чтобы имитировать количество повторений и загрузку сервера.

Есть ли способ сделать это? Любые советы?

UPD. структура таблицы следующая:
  CREATE TABLE exp_favorites (
favorites_id int (10) unsigned NOT NULL auto_increment,
type varchar (16) NOT NULL default 'entry_id',
author_id int (10) unsigned NOT NULL default '0',
entry_id int (10) unsigned NOT NULL,
member_id int (10) unsigned NOT NULL,
site_id smallint (3) unsigned NOT NULL default '1',
entry_date int (10) unsigned NOT NULL,
notes текст NOT NULL,
public char (1) NOT NULL default 'y',
ПЕРВИЧНЫЙ КЛЮЧ (favorites_id),
КЛЮЧ author_id (author_id),
КЛЮЧ entry_id (entry_id),
КЛЮЧ member_id (member_id),
КЛЮЧ site_id (site_id),
КЛЮЧ public (public),
КЛЮЧ type (type)
)

  • 0
    Можете ли вы разместить свою структуру таблицы здесь? Ваша база данных нормализована?
  • 0
    обновил пост информацией о структуре таблицы. Я не знаю много о нормализации, но она выглядит для меня нормализованной.
Теги:
query-optimization

1 ответ

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 может относиться к записи в любой из 3 таблиц, и, таким образом, объединение станет просто огромным. Или я здесь не прав?
  • 0
    @runner: посмотрите на условия соединения в трех последних соединениях таблицы - все они от f.item_id до соответствующего поля в каждой таблице.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню