Эффективный способ получить все статьи с набором тегов в MySQL - PullRequest
2 голосов
/ 24 декабря 2011

Мне нужен эффективный способ выбрать все статьи, по крайней мере, с тегами «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 Ответ

3 голосов
/ 24 декабря 2011

Я ожидаю, что этот запрос будет быстрее (с учетом ваших условий):

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)

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

...