У меня есть таблица с такими же вещами, множество столбцов и 1000 разных способов выбора. Это кошмар. Однако я обнаружил, что существуют определенные комбинации фильтров, которые часто используются. Это те, для которых я бы создал индексы, а другие оставил, которые редко используются для медленной работы. В MSSQL я могу выполнить запрос, чтобы показать мне самые дорогие запросы, которые были выполнены с базой данных, у MySQL должна быть похожая вещь. Получив их, я создаю индекс, который охватывает столбцы, чтобы ускорить их. В конце концов, вы получите 90% покрытия. Лично я никогда не разработал бы такой стол снова, если бы на меня не направили AK47. (мои индексы в 3 раза больше, чем данные в таблице, что очень плохо, если вам нужно добавить группу или записи).
Хотя я не уверен, как бы я изменил дизайн таблицы, моей первой мыслью было бы разделить таблицу на две части, но это привело бы к головным болям в других местах.
Таблица пользователей (идентификатор пользователя, имя)
1, Lisa
2, Jane
3, John
Таблица атрибутов пользователя (UserID, AttributeName, AttributeValue)
1, EYES, Brown
1, GENDER, Female
2, EYES, Blue
2, GENDER, Female
3 EYES, Blue
3, GENDER, Male
Это ускорит идентификацию атрибутов, но сделает ваши запросы не такими простыми для написания.
SELECT UserID, COUNT(*) as MatchingAttributes
FROM UserAttributes
WHERE (UserAttributes.AttributeName = 'EYES' AND UserAttributes.AttributeValue = 'Blue') OR
(UserAttributes.AttributeName = 'GENDER' AND UserAttributes.AttributeValue = 'Female')
Это должно вернуть следующее
UserID, MatchingAttributes
1, 1
2, 2
3, 1
Все, что вам нужно сделать, это добавить HAVING COUNT (*) = 2 к запросу, чтобы выбрать только идентификаторы, которые соответствуют. Его немного сложнее выбирать, но он также предоставляет удобную функцию: скажем, вы фильтруете по 10 атрибутам и возвращаете все те, которые имеют 10 соответствий. Круто, но сказать, что ни один не соответствует 100%. Вы могли бы сказать, эй, я не нашел ни одного подходящего, но у них было 9 из 10 или 90% соответствия. (просто убедитесь, что, если я ищу голубоглазую блондинку, я не получаю сообщение о том, что нигде не найдено, но вот следующие самые близкие совпадающие, содержащие голубоглазых парней блондинки с соответствием 60%. быть очень не крутой)
Существуют и другие вещи, которые необходимо учитывать, если вы решили разделить таблицу, например, как хранить атрибуты в виде чисел, дат и текста в одном столбце? Или это отдельные таблицы или столбцы. Нелегко ответить ни в одну из таблиц, либо в обе стороны.