2016-02-08 4 views
0

У меня проблема с эффективностью на руках, и я ищу способы ее решения. Вот так:Эффективно синхронизировать потоковый ввод с большой базой данных SQL

  • У меня есть потоковые данные на основе строк, поступающие в систему из онлайн-источника, каждый с уникальным id.
  • У меня есть база данных SQL с существующими данными на основе строк, индексированная на id.
  • Мне нужно обновить базу данных SQL новой потоковой передачей данных, если она отличается от существующих данных уже в базе данных.

Очевидное решение состоит в:

  1. просматривать полученные Row
  2. Read соответствующую строку в базе данных
  3. Если отличается данных, обновление базы данных

Большое число округло поездки делают этот алгоритм неимоверно медленным.

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

Итак, какие у меня альтернативы?

+0

Дозирование представляется одним из решений. Либо партия на удобной единице времени (например, 10 секунд), либо партия на удобном количестве записей (скажем, 100). Тогда сравнения могут быть сделаны в базе данных, и все будет быстрее. –

+0

@GordonLinoff Получается, у меня есть удачная оптимизация. Поскольку я просто обновляю базу данных новыми данными, я могу выпустить REPLACE вместо INSERT и позволить базе данных обрабатывать перезапись. Нет необходимости в круглых поездках и очень быстро. – frivat

ответ

0
  1. Разделите базу данных на несколько частей. (Чтобы устранить проблему размера)

  2. Разработать алгоритм кэширования некоторых из этих элементов базы данных в память. (Скорость)

  3. Основываясь на входящем id, хэш запрос к соответствующей базе данных.

Если шаг 2 не может быть достигнут эффективно, это не будет работать.

Смежные вопросы