Оптимизация запроса MySQL с несколькими левыми объединениями

У меня есть таблицы NewsStories, которые я оставил соединить с некоторыми связанными таблицами. Каждая новость может иметь несколько изображений, категорий и адресов. Таким образом, запрос по существу:

SELECT * FROM NewStories 

LEFT JOIN Images ON Newstories.id=Images.story_id

LEFT JOIN Categories ON NewsStories.id=Categories.story_id

LEFT JOIN Addresses ON NewsStories.id=Addresses.story_id

WHERE ...

Обычно есть несколько изображений и адресов для каждой истории и 1 или 2 категории. Таблица NewsStories содержит около 10 000 статей.

Проблема в том, что производительность довольно медленная (порядка 15-20 секунд, хотя h он немного различается и иногда опускается до 5 секунд).

Мне было интересно, есть ли лучший способ организовать запрос, чтобы ускорить его (я новичок в SQL).

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

По сути, я пытаюсь реконструировать свойства новостной статьи в единый объект, которым я могу управлять во внешнем интерфейсе.

Вот объяснение (извиняюсь, если форматирование вышло некорректно). Я предполагаю, что я неправильно индексирую Адреса, если это "Использование где". Это правильно?

id  select_type table   type    possible_keys   key key_len ref rows    Extra

1   SIMPLE  Addresses   ALL NULL    NULL    NULL    NULL    6640    Using where

1   SIMPLE  NewsStories eq_ref  PRIMARY PRIMARY 767 NewsStories.Addresses.story_id 1    Using where

1   SIMPLE  Images  ref PRIMARY PRIMARY 767 NewsStories.NewsStories.id  1   Using index

1   SIMPLE  Categories  ref PRIMARY PRIMARY 767 NewsStories.NewStories.id   1
10
задан diEcho 12 October 2011 в 06:44
поделиться