MySQL - запрос производительности со многими условиями где - PullRequest
0 голосов
/ 01 мая 2018

Допустим, есть таблица, которая выглядит следующим образом:

имя | дата | значение1 | значение2 | значение3 | ... | value100 Варчар | дата | плавать | плавать | плавать | плавать ...

Я могу сделать SELECT для этого и использовать WHERE значение1> n или WHERE значение1> n И значение2 = n.

Однако, что если я хотел бы включить запросы, включающие до 100 условий, для фильтрации результатов в таблице на основе значений в каждом столбце?

Возможно ли это? Если да, как вы могли бы индексировать это, поскольку максимальное число столбцов в индексе равно 16? Результаты любой комбинации ГДЕ условий мне понадобятся в течение 10 секунд.

Спасибо за понимание.

1 Ответ

0 голосов
/ 01 мая 2018

Смотрите мой ответ на следующий вопрос 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)
.... ;

Вы также можете использовать ВНУТРЕННИЕ СОЕДИНЕНИЯ вместо

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"
... ;

Хотя это лучше, чем таблица с сотнями столбцов, она все равно может стать довольно уродливой по мере увеличения числа «значений». Я хотел бы рассмотреть возможность использования внешнего поискового движка или индексатора свободного текста / атрибутов.

...