Я пытаюсь построить следующее решение для поиска по граням:
- Считайте 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. (для скорости).
Какие другие решения (базы данных) могли бы быть лучше здесь? Речь идет о соединении записи и чтения данных как можно быстрее.