Эффективный способ получить все статьи с набором тегов в 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)

Это частный случай реляционного деления. Вот обширный охват вашего дела именно. Вы будете удивлены тем, сколько хороших способов есть.

Другие вопросы по тегам