Incrémente rapide en vrac dans MySQL
-
30-10-2019 - |
Question
J'ai une grande table foobar
décrivant une relation de plusieurs à plusieurs et contenant des millions de foo
's, des millions de bar
et 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 foo
avec 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 bar
dans 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