Capturo Usuários que comentam os Artigos de outros Usuários, como
INSERT IGNORE INTO AuthorCommentators (AuthorID,CommentatorID,Freq)
SELECT AuthorID,CommentatorID,C FROM
(SELECT b.UserID AS AuthorID,c.UserID AS CommentatorID,COUNT(*) AS C
FROM ArticleComments a
JOIN ArticleMap b ON a.ArticleID=b.ArticleID
JOIN CommentMap c ON a.CommentID=c.CommentID
GROUP BY b.UserID,c.UserID
) c
ON DUPLICATE KEY UPDATE Freq=c.C
mas como ArticleComments
a tabela é muito grande, a consulta é lenta.
Existe alguma maneira de melhorar esta consulta?
As tabelas são simples,
CREATE TABLE AuthorCommentators
(
AuthorID int(11) unsigned NOT NULL,
CommentatorID int(11) unsigned NOT NULL,
Freq mediumint(7) unsigned,
INDEX(CommentatorID),
INDEX(Freq),
PRIMARY KEY(AuthorID,CommentatorID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_general_ci;
CREATE TABLE ArticleComments
(
ArticleID int(11) unsigned NOT NULL,
CommentID int(11) unsigned NOT NULL,
INDEX(CommentID),
PRIMARY KEY(ArticleID,CommentID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_general_ci;
CREATE TABLE ArticleMap
(
ArticleID int(11) unsigned NOT NULL,
UserID int(11) unsigned NOT NULL,
INDEX(UserID),
PRIMARY KEY(ArticleID,UserID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_general_ci;
CREATE TABLE CommentMap
(
CommentID int(11) unsigned NOT NULL,
UserID int(11) unsigned NOT NULL,
INDEX(UserID),
PRIMARY KEY(CommentID,UserID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_general_ci;
Como ambos Articles
e Comments
podem ter vários autores, tenho que normalizar a arquitetura.
Obtenha um subtotal todos os dias (ou alguma outra unidade de tempo conveniente). Coloque esses subtotais em uma "tabela de resumo".
Ou execute seu IODKU apenas de onde parou da última vez, não desde o início. Claro, precisaria de uma pequena mudança;
Mais sobre tabelas de resumo: http://mysql.rjweb.org/doc.php/summarytables