Сколько полей нужно проиндексировать и как их создать? - PullRequest
2 голосов
/ 22 октября 2009

В базе данных MySQL есть таблица со следующими полями:

ID | GENDER | BIRTHYEAR | POSTCODE

Пользователи могут искать в таблице, используя любые поля в любой комбинации (т. Е. SELECT * FROM table WHERE GENDER = 'M' AND POSTCODE IN (1000, 2000); или SELECT * FROM table WHERE BIRTHYEAR = 1973;)

Из документации MySQL он использует левую индексацию. Поэтому, если я создам индекс по всем 4 столбцам, он не будет использовать индекс, если поле идентификатора не используется. Нужно ли создавать индекс для каждой возможной комбинации полей (ID; ID / GENDER; ID / BIRTHYEAR и т. Д.) Или будет достаточно создания одного индекса для всех полей?

Если это имеет какое-либо значение, в этой таблице более 3 миллионов записей.

Ответы [ 3 ]

1 голос
/ 22 октября 2009

В этой ситуации я обычно регистрирую критерии поиска, количество возвращаемых результатов и время, затраченное на поиск. То, что вы создаете гибкость поиска по любому полю, не означает, что ваши пользователи используют эту гибкость. Обычно я создавал бы индексы для разумных комбинаций, а затем, как только я определил, что шаблоны использования отбрасывают малоиспользуемые индексы или создают новые непредвиденные индексы.

Я не уверен, поддерживает ли MySQL статистику или гистограммы для искаженных данных, но индекс пола может или не может работать. Если MySQL поддерживает статистику, то это будет указывать на селективность индекса. В общей популяции индекс по полю с 50/50 не поможет. Если вы используете данные, полученные из компьютерных программистов, а данные по мужчинам составляют 95%, то для поиска женщин будет использоваться индекс.

0 голосов
/ 22 октября 2009

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

Вы можете индексировать год рождения, потому что он должен отличаться для многих записей (но я думаю, что максимум до 120 лет рождения).

Пол, по моему мнению, не нуждается в индексе.

Вы можете узнать, какие комбинации полей с наибольшей вероятностью дают разные результаты, и индексировать их, например: birthyear - почтовый индекс, id - birthyear, id - почтовый индекс.

0 голосов
/ 22 октября 2009

Используйте EXPLAIN.

(я бы сказал, используйте Postgres тоже, lol).

Кажется, что последние версии MySQL могут использовать несколько индексов в одном запросе, они называют это объединением индексов. В этом случае достаточно одного индекса на столбец.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...