Как я могу установить максимальное количество строк в таблице MySQL?

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

CREATE TABLE `table_with_limit` 
   `id` int(11) DEFAULT NULL
) ENGINE=InnoDB MAX_ROWS=100000

Но MAX_ROWS Свойство не является жестким ограничением ("храните не более 100 000 строк и удаляйте другие"), но подсказкой для механизма базы данных является то, что в этой таблице будет по крайней мере 100 000 строк.

Единственно возможный способ решения проблемы - использовать BEFORE INSERT триггер, который проверит количество строк в таблице и удалит более старые строки. Но я уверен, что это огромный перегрев:/

Другое решение - очищать таблицу скриптом cron каждые N минут. Это самый простой способ, но все же ему нужна другая система, за которой нужно следить.

Кто-нибудь знает лучшее решение?:)

4 ответа

Решение

Попробуйте наложить ограничение на добавление новой записи в таблицу. Поднимите ошибку, когда новая запись будет добавлена.

DELIMITER $$

CREATE TRIGGER trigger1
BEFORE INSERT
ON table1
FOR EACH ROW
BEGIN
  SELECT COUNT(*) INTO @cnt FROM table1;
  IF @cnt >= 25 THEN
    CALL sth(); -- raise an error
  END IF;
END
$$

DELIMITER ;

Обратите внимание, что операция COUNT может быть медленной на больших таблицах InnoDb.

В MySQL 5.5 вы можете использовать инструкцию SIGNAL // RESIGNAL, чтобы вызвать ошибку.

  • Создайте таблицу с 100 000 строк.
  • Предварительно заполните одно из полей "отметкой времени" в прошлом.
  • Выберите самую старую запись, обновите "отметку времени" при "создании" (обновлении) записи.
  • Используйте только выбор и обновление - никогда не используйте вставку или удаление.
  • Обратный индекс в поле "отметка времени" ускоряет выбор / обновление.

Нет никакого способа ограничить максимальное количество строк таблицы в MySQL, если вы не напишите Trigger для этого.

Я просто придумываю ответ из головы. Я предполагаю, что вам нужно что-то вроде "корзины", куда вы помещаете записи, и что вы хотите очистить ее до того, как она достигнет определенного числа записей.

После оператора вставки запустите SELECT LAST_INSERT_ID(); который получит автоматическое увеличение идентификатора записи. Да, вам все равно придется выполнить дополнительный запрос, но он будет ресурсоемким. Как только вы достигнете определенного значения, обрежьте таблицу и сбросьте идентификатор автоматического увеличения.

В противном случае у вас не может быть "закрытой" таблицы в mysql, поскольку у вас должны быть заранее определенные действия, такие как (не разрешаем ли мы запись, усекаем ли мы таблицу? И т. Д.).

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