LINUX.ORG.RU

Посоветуйте БД технологии для оптимизации поиска по большому объёму данных

 , , , ,


1

1

В БД имеется таблица products содержащая более полутора миллионов записей. Данная таблица заполняется/обновляется через крон скрипты ежедневно из разных источников.

Посредством web UI администратор системы имеет возможность добавлять/удалять fields - колонки этой таблицы и конфигурировать какая колонка из CSV фида (источника данных) соответствует какой колонке в этой таблице. В настоящее время имеется 37 колонок таблицы данных таких как например Vendor Name, VPN, SKU, EANUPC, Dealer Price, Stock, Stock Backlog Quantity, Stock Backlog ETA, Warehouse, Description, Category, OEM Part Number, etc.

Таким образом администратор системы может для CSV-фида из источника http://sourceX/feed.csv установить через конфигуратор:
колонка CSV #1 -> VPN
колонка CSV #2 -> Dealer Price
колонка CSV #12 -> Stock
колонка CSV #13 -> EANUPC
колонка CSV #14 -> Stock Backlog Quantity
...........etc.............

Требуется организовать поиск по таблице products в котором администратор может искать по любой комбинации колонок, например:
- найти все продукты где $5.55 <= Dealer Price <= $7.50 и Stock > 10
- найти все продукты где Description содержит «keyboard» и EANUPC начинается с XXXXXXX
- найти все продукты в которых VPN содержит XXX или SKU содержит XXX
...................etc...............

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

В настоящее время после запроса можно сходить покурить пока появятся результаты. Используется mongodb, индексы есть но не помогают либо расставлены неправильно. Количество записей ~1.6M.

Прошу посоветовать возможно ли как то оптимизировать скорость работы поиска (с добавлением записей проблем нет) возможно засчёт замедления крон-скриптов импортирующих/добавляющих записи.

Машина довольно мощная:
- восьмиядерный AMD Opteron(TM) Processor 6220
- 32 гигабайта памяти
- диск вроде SSD 120 гигабайт

Прежде всего хотелось бы спросить совета относительно оптимальной БД для таких нужд. Оптимально ли подходит mongodb или стоит копать в другую сторону? Слышал что то про Elastic Search. Время для изучения новых технологий есть. Однако хотелось бы быть уверенным что копаю в правильном направлении.

Также буду благодарен если посоветуете какую то литературу по теме.


Ответ на: комментарий от znenyegvkby

Не добил мысль.

Если соблюдать правила, устанавливать экспериментально нужные параметры (шарды, подбор index.refresh_interval (как уже подметили выше) для нахождения оптимального кол-ва I/O-операций в секунду именно для вашего диска, bulb, и т.д. (а если честно нюансов у ES очень много, и оптимизацию на уровне спичек можно начать от всяких index.compound_on_flush/index.compount_format для установки меньшего/большего кол-ва файлов, если у вас SSD/SAS, и закончить тем же index.index_concurrency для нахождения баланса параллельных индексирующих потоков именно для вашей конфиги)), то возможно получить неплохой результат, но все же это будет совсем не то, что вы привыкли видеть в повседневных СУБД типа mysql/postgresql/etc, или в том же сфинксе, если смотреть на одну весовую категорию. Но эти затраты с лихвой окупаются, и ниже (то есть уже выше) - ясно почему.

znenyegvkby
()
Ответ на: комментарий от mongo

Либо вы что то не учли либо что то действительно пошло не так потому что /var/lib/mongodb занимает 95 G. Может это индексы занимают много места, так что если их снести будет так как вы пишите? Добавление информации в запись или её обновление может так раздувает размер базы данных.

Я думаю, что из монго наверное как-нибудь можно для начала попробовать экспортировать данные в plain-text файл с разделителями и посмотреть сколько на самом деле занимают чистые данные (пусть и с овехедом на представление числовых полей в форме текста), посмотреть сколько там реально записей(wc -l) и каков средний размер записи (поделив размер полученного дампа на число записей). А потом, например, эти данные можно будет импортнуть в постгрес, увешать индексами и посмотреть как изменится производительность запросов.

anonymous
()

Ну чо там, как успехи?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.