MySQL - производительность запросов с множеством условий where

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

имя | дата | значение1 | значение2 | значение3 | ... | значение100 varchar | дата | плавать | плавать | плавать | плавать ...

Я могу делать с этим параметры SELECT и использовать WHERE value1> n или делать WHERE value1> n AND value2 = n.

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

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

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

Если у вас действительно есть таблица с более чем 100 столбцами, я могу сказать, что это само по себе плохой дизайн базы данных.

Tim Biegeleisen 01.05.2018 04:28

даже если вы все это проиндексировали; это никогда не поможет вам, так как вам нужно будет убедиться, что где вы используете каждый индекс по порядку.

Napoli 01.05.2018 04:30

Какие индексы вы помещаете в таблицу, зависят от того, какие запросы вы запускаете к таблице, как часто эти запросы выполняются и от распределения данных. Правильная постановка вопроса с конкретным примером и правильной вспомогательной информацией выходит за рамки вопроса здесь, на SO. Задавать абстрактные вопросы - это слишком широко.

symcbean 01.05.2018 14:06

Спасибо за комментарии. Имеет смысл.

user9723858 01.05.2018 15:23
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
4
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

Спасибо за объяснение

user9723858 01.05.2018 15:23

Другие вопросы по теме