У меня есть таблица с 8 столбцами со смешанными типами данных (int, text, varchar и т.д.)
В этой таблице только один запрос, который работает на нем (SELECT), и внутри этого запроса он использует 4 "AND" для фильтрации результатов.
Мой вопрос: каковы некоторые рекомендации по индексированию в этой ситуации?
В моем случае время чтения имеет более высокий приоритет, чем время записи, поэтому я должен индексировать все столбцы, которые появляются в предложении AND? Должен ли я индексировать только целые числа?
Для одного запроса создайте индекс со всеми затронутыми столбцами.
Индексы MySQL работают слева направо, что означает, что если у вас есть таблица со столбцами:
A varchar(255)
B varchar(50)
C int(11)
D datetime
Индекс на KEY index (A,B,C,D)
означает, что MySQL будет искать столбцы в вашем запросе слева направо. Если вы включите их все в свой запрос, они будут использовать их все, но если вы включите только A
и B
, они будут использовать их для фильтрации результатов, прежде чем применять остальные условия к оставшемуся набору результатов (при условии, что вы используете AND
).
Однако, если вы включаете только C
и D
, он не будет использовать этот индекс вообще, так как он не знает, что искать в A
.
Если вы быстро посмотрите как MySQL использует свои индексы, вы должны иметь возможность выработать лучшие столбцы для индексации.
Я думаю, вы должны создать индекс для каждого столбца, который вам нужен для ваших операторов select. Обратите внимание, что в mysql существует ограничение в длине поля, вы создаете индекс. Созданный индекс не может превышать 1000 байтов для MyISAM и 767 для InnoDb (спасибо OMG Ponies). Здесь вы можете найти обсуждение об оценке размера индекса для столбца varchars. Если у вас нет записей, это должно значительно повысить производительность операторов select.