mysql, принудительно ограничить записи в таблице
Я храню некоторые временные данные в таблице памяти. Мне нужны только 20 самых последних записей, и я бы предпочел, чтобы данные всегда были в куче. Как мне это сделать? я уверен, что ничего не могу сделать с таблицей памяти, но как я должен обрабатывать таблицы записей? я должен добавить автоинкрементный ключ и удалить самый старый, когда я хочу вставить новое значение в?
2 ответа
Не могли бы вы подробнее описать, что вы пытаетесь сделать? Я не понимаю, почему вы хотите сохранить самые последние данные в дополнительной таблице, когда вы можете просто использовать SELECT в порядке убывания и LIMIT 20
, Если запрос SELECT слишком дорогой, просто кешируйте результат, используя memcached или аналогичный, и очищайте кеш каждый раз, когда вставляются новые данные.
Если дополнительная таблица действительно необходима, есть несколько способов удалить старые данные из таблицы. Либо вы получаете идентификатор 20-го последних данных (снова в порядке убывания и LIMIT 19,1
и удалите все, что имеет меньший идентификатор (если у вас есть индекс автоинкремента, отметка времени и т. д.) или вы SELECT COUNT(*)
а затем сделать DELETE
в порядке возрастания и LIMIT
(всего предметов - 20). Это может быть упаковано в cronjob, который запускается каждые несколько минут.
Но я бы очень рекомендовал использовать кеш и смотреть на определение таблицы. С приличным индексом проблем быть не должно.
Возможно добавление в таблицу с 20 записями и удаление самого старого элемента (то есть элемента с минимальным идентификатором?). Однако обратите внимание, что это фрагментирует таблицу.
Это нормально, пока вы бежите OPTIMIZE
время от времени.
Другой способ состоит в том, чтобы предварительно выделить 20 записей и сохранить отдельный счетчик того, какая запись является самой последней. Затем вместо вставки / удаления вы обновите идентификатор элемента на основе счетчика, который вы затем увеличите (мод 20 + 1) и сохраните снова.
Однако обратите внимание, что обе эти модели работают только под "однопоточной" моделью. Если на столе запущено несколько потоков, возможно, они конфликтуют.
Если счетчик находится в памяти программ, разделен потоками, но защищен должным образом, это будет как потокобезопасным, так и эффективным.