Eu tenho uma tabela tag_map simples
CREATE TABLE TagMap
(
TagID mediumint(7) unsigned,
ArticleID int(11) unsigned,
FOREIGN KEY(TagID) REFERENCES Tags(TagID) ON DELETE CASCADE,
FOREIGN KEY(ArticleID) REFERENCES Articles(ArticleID) ON DELETE CASCADE,
PRIMARY KEY(TagID,ArticleID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci KEY_BLOCK_SIZE=1
Recebo as co-tags (tags, que aparecem junto com uma tag específica):
SELECT TagID AS TagID2,COUNT(*) FROM TagMap WHERE ArticleID IN(
SELECT ArticleID FROM TagMap WHERE TagID=1 // This is TagID1
)
GROUP BY TagID
Como posso fazer essa consulta para todas as tags para obter
TagID1,TagID2,COUNT(*)
A tabela é enorme (10 a 50 milhões de linhas) e cada artigo tem dezenas de tags. Assim, o desempenho é fundamental.
ATUALIZADO: o índice no ArticleID pode ajudar a melhorar o desempenho da consulta