Совет проектирования баз данных необходим

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

Я вставляю в одну таблицу ~2 миллион строк каждый день, эти таблицы затем заархивированы и сжались ежемесячно. Каждая ежемесячная таблица содержит ~15 000 000 строк. Хотя это увеличивает месяц на месяце.

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

Все вышеупомянутое работает отлично. Однако моя компания теперь хочет выполнить некоторую статистику против этих данных, и эти таблицы становятся слишком большими для обеспечения результатов в том, что считали бы разумным сроком. Даже с соответствующими индексами установлен.

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

Основные преимущества I видят использования чего-то как кэш-память:

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

Основные недостатки I видят использования чего-то как кэш-память:

  • Данные не являются персистентными, если машина перезагружается / кэш сбрасывается.

Основные преимущества использования MySql

  • Персистентные данные.
  • Меньше изменений кода (хотя добавляя что-то как кэш-память тривиально так или иначе),

Основные недостатки использования MySql

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

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

Большое спасибо.

Alan

7
задан Alan Hollis 27 May 2010 в 09:16
поделиться

4 ответа

Помимо вариантов, которые вы обсуждали выше, вы также можете рассмотреть возможность добавления более мощного оборудования в картину, если это вариант.

Этот фрагмент вашего вопроса показывает, что основная проблема здесь заключается в скорости получения результатов:

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

В ситуациях, когда важна скорость получения результатов, использование лучшего / дополнительного оборудования для решения проблемы часто может оказаться дешевле, чем разработка нового кода / структур базы данных и т. Д.

Просто мысль!

2
ответ дан 7 December 2019 в 12:15
поделиться

(Еще один ответ от меня, отличающийся настолько, что я размещу его отдельно)

Два вопроса:

Какого рода статистику хочет генерировать ваша компания?
и
После того, как строки вставлены в базу данных, они когда-нибудь изменяются?

Если данные не изменяются после вставки, то вы можете создать отдельную таблицу "статистики", которую вы будете изменять/обновлять по мере вставки новых строк, или, возможно, вскоре после вставки новых строк.

например, такие вещи:

  • Когда вставляется новая строка, относящаяся к статистике "B", идите и увеличьте число в другой таблице для статистики "B", минута "Y"
    . или
  • Каждый час выполняйте небольшой запрос на строки, которые были вставлены за последний час, который генерирует статистику за этот час и хранит ее отдельно
    . или
  • Как выше, но каждую минуту и т.д.

Трудно сказать что-то более конкретное, не зная деталей, но в зависимости от статистики, которая вам нужна, такие подходы могут помочь.

1
ответ дан 7 December 2019 в 12:15
поделиться

Я работаю в компании с похожей ситуацией, с миллионами вставок ежемесячно.

Мы приняли стратегию обобщения данных в небольших таблицах, сгруппированных по определенным полям.

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

Время от времени мы перемещаем самые старые строки в резервную таблицу, уменьшая рост основной таблицы.

1
ответ дан 7 December 2019 в 12:15
поделиться

Если вы хотите провести некоторый анализ статических данных, полученных несколько дней назад, возможно, вам стоит подумать об использовании чего-то вроде системы OLAP.

По сути, этот тип системы хранит промежуточную статистику в своем формате, чтобы выполнять быстрые операции sum (), avg (), count () ... на больших таблицах.

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

Взгляните.

1
ответ дан 7 December 2019 в 12:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: