Каков наиболее эффективный способ хранения данных на основе даты? - PullRequest
0 голосов
/ 11 января 2019

Я новичок здесь, и у меня есть проект, в котором у меня проблема с производительностью, которую, кажется, трудно исправить Я создал поиск объектов, которые имеют доступность, означает очень простую структуру:

ObjectID | Date | Number of available objects 
---------------------------------------------
Object1  | 01.01.2019 | 1
Object1  | 02.01.2019 | 1
Object1  | 03.01.2019 | 0
Object1  | 04.01.2019 | 1
Object1  | 05.01.2019 | 1
Object2  | 01.01.2019 | 1
Object2  | 02.01.2019 | 1
Object2  | 03.01.2019 | 0
Object2  | 04.01.2019 | 1
Object2  | 05.01.2019 | 1

Я работаю с MySQL и PHP

Типичный запрос: Какие объекты доступны в период с 01.01.2019 по 28.02.2019 10 дней подряд.

Нетрудно заставить его работать с mysql, но как только у вас есть более 10 пользователей, использующих функцию поиска, нагрузка на сервер становится чрезвычайно высокой, даже если таблица оптимизирована (индексы и т. Д.). Сервер имеет 2 ядра по 4 ГБ. оперативной памяти.

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

В общей сложности у нас хранится около 20 000 объектов и доступных для макс. 500 дней, поэтому у нас есть около 10.000.000 наборов данных в моем первом решении.

Кто-нибудь имеет и представляет, какой самый эффективный способ сделать это? (Как сохранить его для быстрого поиска?)

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

Спасибо за вашу помощь и всего наилучшего, Кристоф

1 Ответ

0 голосов
/ 12 января 2019
  • Не хранить даты в формате 28.02.2019. Переверните его, затем используйте DATE тип данных в таблице. Пожалуйста, предоставьте SHOW CREATE TABLE.
  • Какой у вас алгоритм поиска?
  • В заголовке написано «количество объектов», но значения кажутся только 0 или 1, как будто это логический флаг ??
  • Какой максимальный промежуток времени? (Если под 64, есть бит-ориентированные трюки, которые мы могли бы играть.)

Просматривая соседние строки (см. LAG(), если используется MySQL 8.0), решите, когда объект изменит состояние . Сохранить эти даты.

После этого это еще один прыжок, чтобы получить «сколько дней подряд», начиная с одной из этих дат. Это будет простой запрос и очень быстрый, если у вас есть подходящий составной индекс.

...