mysql, принудительно ограничить записи в таблице - PullRequest
1 голос
/ 15 февраля 2009

Я храню некоторые временные данные в таблице памяти. Мне нужны только 20 самых последних записей, и я бы предпочел, чтобы данные всегда были в куче. Как мне это сделать? Я уверен, что ничего не могу сделать с таблицей памяти, но как я должен обрабатывать таблицы записей? я должен добавить автоинкрементный ключ и удалить самый старый, когда я хочу вставить новое значение в?

Ответы [ 2 ]

1 голос
/ 17 марта 2009

Не могли бы вы подробнее описать, что вы пытаетесь сделать? Я не понимаю, почему вы хотите сохранить самые последние данные в дополнительной таблице, когда вы можете просто использовать SELECT в порядке убывания и LIMIT 20. Если запрос SELECT слишком дорогой, просто кэшируйте результат, используя memcached или аналогичный, и очищайте кеш каждый раз, когда вставляются новые данные.

Если дополнительная таблица действительно необходима, есть несколько способов удалить старые данные из таблицы. Либо вы выбираете идентификатор 20-ых последних данных (снова в порядке убывания и LIMIT 19,1 и удаляете все, что имеет меньший идентификатор (в случае, если у вас есть индекс автоинкремента, отметка времени и т. Д.), Либо вы SELECT COUNT(*) и затем делаете DELETE в порядке возрастания и LIMIT (для всех предметов - 20). Это можно упаковать в cronjob, который запускается каждые несколько минут.

Но я бы действительно рекомендовал использовать кеш и смотреть на определение таблицы. С приличным индексом проблем быть не должно.

0 голосов
/ 15 февраля 2009

Возможно добавление в таблицу с 20 записями и удаление старшего элемента (то есть элемента с минимальным идентификатором?). Однако обратите внимание, что это фрагментирует таблицу.

Это нормально, если вы запускаете OPTIMIZE время от времени.

Другой способ состоит в том, чтобы предварительно выделить 20 записей и сохранить отдельный счетчик того, какая запись является самой последней. Затем вместо вставки / удаления вы обновите идентификатор элемента на основе счетчика, который вы затем увеличите (мод 20 + 1) и сохраните снова.

Однако учтите, что обе эти модели работают только в «однопоточной» модели. Если в таблице запущено несколько потоков, возможно, они конфликтуют.

Если счетчик находится в памяти программ, разделен потоками, но защищен должным образом, это будет как потокобезопасным, так и эффективным.

...