Наиболее эффективный запрос MySQL для обновления таблицы из идентичной таблицы памяти
Я реализую кэш памяти для таблицы, которая выглядит следующим образом (упрощенно):
Item1 (целое число), Item2 (целое число), cnt (целое число)
Исходная таблица включает в себя миллионы таких пар. и он быстро обновляется.
Чтобы сделать все это более эффективным, я хочу записать новые пары в одну и ту же таблицу памяти и периодически обновлять реальную таблицу на диске с помощью cron.
Хрон должен сделать следующее: для каждой пары, если в таблице, не связанной с памятью, есть подобная пара, увеличьте счет на количество из таблицы памяти. Если такой пары не существует, создайте ее с подсчетом из таблицы памяти.
Как я могу сделать сброс (из таблицы памяти в реальную таблицу) наиболее эффективным?
Примечания: среда Mysql 5.0.45 PHP 5.2.6 CentOS
2 ответа
Вы могли бы использовать INSERT ... ON DUPLICATE KEY UPDATE
запрос - но это зависит от первичных ключей или UNIQUE
индексы на вашей главной таблице.
INSERT
INTO <<master_table>> (Item1, Item2, cnt)
SELECT Item1, Item2, cnt FROM <<memory_table>>
ON DUPLICATE KEY UPDATE cnt = cnt + VALUES(cnt);
Создать PRIMARY KEY
на диске таблицы:
ALTER TABLE maintable ADD CONSTRAINT pk_maintable_item1_item2 (item1, item2)
и выполните следующий запрос:
INSERT
INTO maintable
SELECT item1, item2, COUNT(*) AS cnt
FROM memtable mem
GROUP BY
item1, item2
ON DUPLICATE KEY
UPDATE cnt = maintable.cnt + mem.cnt
Обратите внимание, однако, что если у вас много DISTINCT item1, item2
пар, то решение, предложенное @S. Gehrig
скорее всего, будет работать лучше (из-за накладных расходов на GROUP BY
)