Массовая вставка PHP / MySQL (4000 записей) и производительность для граненого поиска - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь построить следующее решение для поиска по граням:

  • Считайте 4000 цен на товары из разных файлов. Каждая цена имеет 30 свойств
  • Получить количество граней поиска из этих 4000 строк
  • Чтение множества различных выборок (путем фильтрации) из этих 4000 строк

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

В качестве решения на данный момент я решил вставить эти 4000 цен продуктов в базу данных и использовать запросы для получения количества / выбора строк:

  • Память MySQL: вставка строк занимает около 250 мс, считывание и подсчет выполняется очень быстро (около 2 мс для каждого запроса SELECT)
  • MySQL InnoDB: вставка строк занимает около 600 мс, чтение и подсчет немного медленнее (около 5 мс для каждого запроса SELECT)
  • Elasticsearch: вставка строк занимает около 250 мс, но должна быть выполнена с массовой вставкой (HTTP-запрос). Ожидание готовности индекса занимает еще около 250 мс. (Всего 500). Чтение и подсчет работают по-разному (с агрегацией), но могут быть очень быстрыми.

Это сравнение не совсем справедливо, потому что для MySQL я использовал подготовленные операторы вместо массовой вставки. (также потому, что массовая вставка является недостатком и используется только с эластичным для предотвращения 4000 медленных HTTP-запросов).

Производительность таблиц MySQL Memory, по-видимому, велика и приемлема даже при наличии 4 миллионов записей в хранилище. Но меня немного беспокоит масштабируемость и стабильность этого решения.

Другие изученные опции:

  • Apache ignite (но не смог заставить его работать с PHP 7)
  • MemSQL (слишком дорого)
  • VoltDB (только PHP 5.3, а не PHP 7)
  • MongoDB (производительность как эластичный поиск)

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

Какие другие решения (базы данных) могли бы быть лучше здесь? Речь идет о соединении записи и чтения данных как можно быстрее.

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