Наиболее эффективный запрос MySQL для обновления таблицы из идентичной таблицы памяти - PullRequest
1 голос
/ 24 июня 2009

Я реализую кэш памяти для таблицы, которая выглядит следующим образом (упрощенно):

Item1 (целое число), Item2 (целое число), cnt (Целое число)

Исходная таблица включает в себя миллионы таких пар. и он быстро обновляется.

Чтобы сделать все это более эффективным, я хочу записать новые пары в идентичные таблицы памяти и периодически обновлять реальные таблицы на диске с помощью cron.

Хрон должен сделать следующее: для каждой пары, если в таблице без памяти есть подобная пара, увеличить счет на счет из таблицы памяти. Если такой пары не существует, создайте ее с подсчетом из таблицы памяти.

Как сделать очистку (из таблицы памяти в реальную таблицу) наиболее эффективной?

Примечания: среда Mysql 5.0.45 PHP 5.2.6 CentOS

Ответы [ 2 ]

3 голосов
/ 24 июня 2009

Вы можете использовать запрос 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);
2 голосов
/ 24 июня 2009

Создать 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...