Question

J'ai une grande table foobar décrivant une relation de plusieurs à plusieurs et contenant des millions de foo's, des millions de baret tous les bar avoir plusieurs chutes de foo's -> milliards de lignes.

CREATE TABLE `foobar` (
`foo_id` INT(10) UNSIGNED NOT NULL,
`bar_id` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (`foo_id`, `bar_id`),
INDEX `bar_id_idx` (`bar_id`))

J'ai une autre table comptant le foo_id'péché foobar:

CREATE TABLE `foo_amount` (
`foo_id` INT(10) UNSIGNED NOT NULL,
`amount` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (`foo_id`),
INDEX `amount_idx` (`amount`))

Le comptage pourrait être fait comme ceci:

INSERT INTO foo_amount (SELECT foo_id, COUNT(*) AS amount FROM foobar GROUP BY foo_id);

Mais je devrais recomputer la table avec chaque ligne insérée / supprimée dans foobar.

Un insert ajoute généralement un nouveau bar-Object avec plusieurs chutes foo's. Par exemple l'insertion d'un bar avec bar_id 42 Avoir fooavec foo_id's 3, 8, 26, 44, .... on dirait:

INSERT INTO foobar VALUES (3,42), (8,42), (26,42), (44,42), ...;

Ma deuxième tentative était de mettre à jour le foo_count table après chaque inséré bar objet:

INSERT INTO foo_amount (SELECT foo_id, 1 FROM foobar WHERE bar_id = 42)
ON DUPLICATE KEY UPDATE amount = amount + 1;

Mais c'est très lent. Avez-vous des idées sur la façon d'optimiser cela? Une option pourrait être d'accumuler de nouveaux bardans un temporaire foo_count_tmp et le fusionner avec foo_count de temps en temps. La foo_count La table ne serait pas à jour tout le temps, mais ça va. Mais comment pourrais-je déclencher la mise à jour alors?

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top