Допустим, есть таблица, которая выглядит так:
имя | дата | значение1 | значение2 | значение3 | ... | значение100 varchar | дата | плавать | плавать | плавать | плавать ...
Я могу делать с этим параметры SELECT и использовать WHERE value1> n или делать WHERE value1> n AND value2 = n.
Однако что, если бы я хотел включить запросы, содержащие до 100 условий, для фильтрации результатов в таблице на основе значений в каждом столбце?
Это возможно? Если это так, то как вы могли бы индексировать это, если максимальное количество столбцов в индексе составляет 16? Результаты любой комбинации условий WHERE мне понадобятся в течение 10 секунд.
Спасибо за понимание.
даже если вы все это проиндексировали; это никогда не поможет вам, так как вам нужно будет убедиться, что где вы используете каждый индекс по порядку.
Какие индексы вы помещаете в таблицу, зависят от того, какие запросы вы запускаете к таблице, как часто эти запросы выполняются и от распределения данных. Правильная постановка вопроса с конкретным примером и правильной вспомогательной информацией выходит за рамки вопроса здесь, на SO. Задавать абстрактные вопросы - это слишком широко.
Спасибо за комментарии. Имеет смысл.
См. Мой ответ на следующий вопрос https://stackoverflow.com/a/45611294/2350861
Как упоминалось в комментариях к вашему вопросу, не рекомендуется иметь таблицу с таким количеством столбцов. Лучший способ справиться с этой необходимостью для фильтрации атрибутов - создать отдельную таблицу значений с реляционным отображением «многие-к-одному». Затем вы можете отфильтровать желаемые значения следующим образом:
SELECT * FROM table a where conditional = X
AND a.PrimaryId IN
(SELECT P_Id FROM values WHERE ValueType = "value1" AND ValueValue = "x" AND P_Id = a.PrimaryId)
AND a.PrimaryId IN
(SELECT P_Id FROM values WHERE ValueType = "value2" AND ValueValue = "y" AND P_Id = a.PrimaryId)
.... ;
Вы также можете использовать INNER JOINS вместо
SELECT * from table a where conditional = X
INNER JOIN values b
INNER JOIN values c
WHERE a.P_Id = b.P_Id AND a.P_Id = c.P_Id ...
AND b.ValueType = "value1" AND b.ValueValue = "x"
AND c.ValueType = "value2" AND c.ValueValue = "y"
... ;
Хотя это лучше, чем таблица с сотнями столбцов, она все же может стать довольно уродливой, поскольку количество «значений» растет. Я бы подумал об использовании внешней поисковой системы с произвольным текстом / атрибутами или индексатора.
Спасибо за объяснение
Если у вас действительно есть таблица с более чем 100 столбцами, я могу сказать, что это само по себе плохой дизайн базы данных.