Выбор структуры DB при большом количестве фильтров

Имется таблица mysql с 500,000 записей (30 полей). У этой таблицы есть категории характеристик и несколько характеристик на категорию.

Продумываю, как лучше фильтровать одновременно по нескольким характеристикам нескольких категорий, чтобы достичь быстродействия (варианты характеристик меняются редко).

Пример: найти в таблице строку, которая имеет характеристики категории 1 x y z и характеристики категории 2 m p l

Категория 1 - Характеристика 2, 4, 6.

Категория 1: 50 возможных значений характеристик, 10 возможных значений одновременно.

Категория 2: тоже самое.

Основная нагрузка идет на эти 2 категории фильтров, но есть еще другие категории, что приходится учитывать, по которым идет доп.фильтрация:

Категория 3: 10 возможных, 3 одновременных

Категория 4: 30 возможных, 10 одновременных.

Еще N 5 категорий с N возможными значениями и несколькими допустимыми.

Нагрузка относительно большая (5 фильтраций в секунду), но допускается использование долгоиграющего кеша. Что точно будет фильтроваться и в каком количестве - пока не известно, но нужно наметить первую версию структуры, и первые 2 категории будут такими как описал.

Что наметил - отдельную таблицу под первую категорию 'id значения > id обьекта' и отдельную по вторую. Кешируем запросы к этим двум таблицам. Получается, грубо прикинув, кеш на 50к строк на таблицу из 2 таблиц связей что по 5 млн записей каждая. А дальше запросы в таблицы связей других категорий.

Но смущает размер возможной таблицы связей и возможная лучшая архитектура.

Думал о поиске fulltext по полю со списком назначенных идентификаторов и засунуть в одно поле все характеристики категории 1, а во второе категории 2. А сами идентификаторы представить числами разделенными нулем. И само поле разделить на 5 полей, в первое вставляет и ищем характеристики а-г, во втором д-з и тд. Получилась бы таблица связей на 500,000 записей с 2 полями (10 при разделении характеристики по условному имени и назначении ему своего поля)

Нашел set тип поля, но там нет индексов.

Прочел про join, выглядит тяжело.

В какую сторону копать-тестировать? Может создать 1 таблицу для двух категорий с 20 полями, каждое поле по индексу tinyint и выполнять поиск соответствий сразу по всем ?


Ответы (0 шт):