У меня есть вопрос об основной оптимизации базы данных MySQL.
У меня есть 3 таблицы, статьи, теги и теги (которые являются таблицей соединений).
Articles Taggings Tags
id id id
name article_id name
tag_id
Я получаю статьи, которые точно соответствуют указанным тегам, с помощью следующего запроса
SELECT *, COUNT(*) AS c
FROM articles AS a
JOIN taggings AS tng ON a.id = tng.article_id
JOIN tags AS t ON t.id = tng.tag_id
WHERE t.name IN ("Red","Green")
GROUP BY a.id
HAVING c = 2
Этот запрос медленный, поэтому я сделал EXPLAIN и получил следующие результаты:
альтернативный текст http://dl.dropbox.com/u/2306276/EXPLAIN%20results.png
Теперь я не совсем понимаю, что я здесь делаю, но я считаю, что "type: ALL" не годится, поэтому подумал, что я бы добавил индексы (BTREE) к article_id и tag_id в таблице taggings, и запустите запрос еще раз.
альтернативный текст http://dl.dropbox.com/u/2306276/EXPLAIN%20results%202.png
Что ж, это не выглядело лучше для моего необразованного глаза, с тем же количеством строк, что и у предыдущего, и тип по-прежнему ВСЕ в двух случаях.
Так может кто-нибудь сказать мне, где я иду не так, пожалуйста? индексы не помогут мне с этой проблемой?
Моя таблица тегов останется относительно небольшой, поэтому я подумал, что запрос должен сканировать таблицу тегов на предмет указанных мной тегов, а затем (с помощью индексов) иметь возможность мгновенно получать связанные свойства, и все это должно быть очень быстро, очевидно, что-то не так в моих мыслях.
Спасибо
[EDIT] - для комментариев Джея
Я добавил 10 тыс. Статей, 30 тыс. Тегов и 6 тегов, также добавил 2 индекса для tag.name и taggings.tag_id, выполнение запроса все еще занимало много времени, 0,5-1 секунда, ОБЪЯСНЕНИЕ ниже.
альтернативный текст http://dl.dropbox.com/u/2306276/EXPLAIN%20results%203.png