Выбор структуры 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 и выполнять поиск соответствий сразу по всем ?