Эффективный способ получить все статьи с набором тегов в MySQL
Мне нужен эффективный способ выбрать все статьи, по крайней мере, с тегами "Tag1" и "Tag2". Это стандартный способ со следующей схемой базы данных:
articles(id, title)
article_tag(articleid, tagid)
tag(id, name)
SELECT a.*
FROM article a
INNER JOIN (SELECT at.articleid
FROM article_tag at
INNER JOIN article a
ON a.id = at.articleid
INNER JOIN tag t
ON t.id = at.tagid
WHERE t.name IN ("Tag1","Tag2")
GROUP BY at.articleid
HAVING Count(at.articleid) = 2) aa
ON a.id = aa.articleid
Есть ли более эффективный способ повышения производительности?
1 ответ
Решение
Я ожидаю, что этот запрос будет быстрее (с учетом ваших условий):
SELECT a.*
FROM (
SELECT at.articleid AS id
FROM article_tag at
JOIN tag t ON t.id = at.tagid
WHERE t.name = 'Tag1'
) a1
JOIN (
SELECT at.articleid AS id
FROM article_tag at
JOIN tag t ON t.id = at.tagid
WHERE t.name = 'Tag2'
) a2 USING (id)
JOIN article a USING (id);
Однако наиболее важной частью здесь являются индексы. Первичные ключи будут проиндексированы автоматически (я полагаю):
- статьи по (id)
- article_tag on (articleid, tagid) - многостолбцовый индекс
- пометка (id)
Кроме того, они помогут вашему делу:
- пометка (имя)
- article_tag on (tagid)
Это частный случай реляционного деления. Вот обширный охват вашего дела именно. Вы будете удивлены тем, сколько хороших способов есть.