Переместить неактивные строки в другую таблицу? - PullRequest
4 голосов
/ 19 августа 2011

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

Лучше ли хранить эти строки в таблице или перемещать их, когда они становятся неактивными (или через пакетные задания), в отдельную таблицу? Мышление с точки зрения производительности.

Ответы [ 4 ]

3 голосов
/ 19 августа 2011

Обычно перемещение строк между таблицами в надлежащей СУБД не требуется.

Я не знаком со спецификой mysql, но вы должны делать следующее:

  • Убедитесь, что ваш столбец меток времени проиндексирован
  • Кроме того, вы можете использовать active BOOLEAN default true столбец
    • Выполнять пакетный запуск каждый день, чтобы пометить> неактивные строки 24 ч.
    • Использовать частичный индекс для столбца метки времени, чтобы индексировались только строки, помеченные как активные
    • Помните, что у вас есть метка времени и active = TRUE в ваших условиях для попадания в индексы. Используйте EXPLAIN много.
3 голосов
/ 19 августа 2011

Это во многом зависит от того, насколько большой станет ваша таблица, но если она будет расти вечно и иметь значительное количество строк в день, то есть хороший шанс, что перенос старых данных в другую таблицу будет хорошей идеей. Есть несколько способов сделать это, и лучше всего это зависит от вашего приложения и шаблонов доступа к данным.

  1. По сути, как вы сказали, когда строка становится "старой", ВСТАВЬТЕ в архивную таблицу и УДАЛИТЕ из текущей таблицы.

  2. Создайте новую таблицу каждый день (или, возможно, каждую неделю или каждый месяц, в зависимости от размера вашего набора данных), и никогда не беспокойтесь о перемещении старых строк. Вам нужно будет просто запросить старые таблицы при доступе к старым данным, но за текущий день вы получите доступ только к текущей таблице.

  3. Иметь таблицу «сегодня» и «все время». Дублируйте строки «сегодня» в обеих таблицах, синхронизируя их с триггерами или другими механизмами. Когда строка становится старой, просто удалите ее из таблицы «сегодня», оставив строку «все время» в такте.

Одним из преимуществ # 2, которое может быть неочевидным, является то, что я считаю, что индексы MySQL можно оптимизировать для таблиц только для чтения. Таким образом, имея старые таблицы, в которые никогда не записываются, вы можете воспользоваться этой дополнительной оптимизацией.

1 голос
/ 19 августа 2011

Все зависит от баланса между простотой программирования и производительностью.Производительность мудрая, да, это определенно будет быстрее.Но стоит ли увеличивать скорость, трудно сказать.

Я работал над системами, которые прекрасно работают с миллионами строк.Однако, если данные постоянно растут, это в конечном итоге становится проблемой.

Я работал над базой данных, хранящей журналы транзакций для автоматизированного оборудования.Он генерирует сотни тысяч событий в день.Через год запросы просто не будут работать с приемлемой скоростью.Теперь мы сохраняем журналы за последний месяц в основной таблице (все еще миллионы строк) и перемещаем старые данные в архивные таблицы.

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

0 голосов
/ 26 марта 2013

Есть другое решение. Иметь другую таблицу, содержащую только активные записи (tblactiverecords). Когда количество активных записей действительно мало, вы можете просто выполнить внутреннее соединение и получить активные записи. Это должно занять очень мало времени, потому что первичный ключ по умолчанию индексируется в mysql. Поскольку ваши строки становятся неактивными, вы можете удалить их из таблицы tblactiverecords.

create table tblrecords (id int primary key, data text);

Тогда

create table tblactiverecords (tblrecords_id primary key);

вы можете сделать

select data from tblrecords join tblactiverecords on tblrecords.id = tblactiverecords.tblrecords_id;

чтобы получить все активные данные.

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