Наиболее эффективный запрос 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)

Другие вопросы по тегам