JOIN вместо подзапроса для связанных тегов - PullRequest
1 голос
/ 19 декабря 2010

У меня есть три таблицы: bookmarks, tag и tagging.tagging - таблица ассоциаций для привязки тегов к закладкам.Я хотел бы выбрать связанные теги.Для выполнения текущего запроса требуются годы, но я не мог обернуть голову вокруг JOIN, которые могли бы заменить подзапрос, который выбирает все связанные закладки, помеченные определенными идентификаторами тегов.EXPLAIN этого запроса:

1   PRIMARY            ta  index PRIMARY    PRIMARY         8   NULL         3   
1   PRIMARY            t2  ref   tag_id_idx tag_id_idx      8   blinkz.ta.id 89   Using where
2   DEPENDENT SUBQUERY t1  index tag_id_idx bookmark_id_idx 8   NULL         71   Using where 

У меня есть индекс для полей bookmark_id и tag_id в таблице tagging.Таблица tag имеет первичный ключ с именем id

Как можно оптимизировать этот запрос, предпочтительно с помощью JOIN вместо подзапроса?

1 Ответ

2 голосов
/ 19 декабря 2010

Низкая производительность вызвана ошибкой в MySQL , которая, надеюсь, будет исправлена ​​в ближайшее время. До этого попробуйте это вместо:

SELECT tag.name, COUNT(*) AS cnt
FROM tagging T1
JOIN tag
ON T1.tag_id = tag.id  
JOIN (
   SELECT bookmark_id 
   FROM tagging
   WHERE tag_id IN (1, 7) 
   GROUP BY bookmark_id 
   HAVING COUNT(id) = 2
) T2
ON T1.bookmark_id = T2.bookmark_id
GROUP BY tag.id

Я предполагаю, что существует уникальное ограничение на (bookmark_id, tag_id).

...