Оптимизация Mysql с определением ключа

#mysql #optimization

#mysql #оптимизация

Вопрос:

У меня есть следующая таблица. Я не знаю, должно ли определение дополнительных ключей приводить к снижению скорости сервера или нет? Другими словами, если я определю 10 или более ключей для любой таблицы MySQL, увеличится ли скорость моего запроса или нет? Кроме того, рекомендуется ли это (добавление дополнительных ключей в таблицу)?

 CREATE TABLE IF NOT EXISTS `xxx` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`intval1` int(11) DEFAULT NULL,
`intval2` int(11) DEFAULT NULL,
`intval3` int(11) DEFAULT NULL,
`intval4` int(11) DEFAULT NULL,
`intval5` int(11) DEFAULT NULL,
`intval6` int(11) DEFAULT NULL,
`intval7` int(11) DEFAULT NULL,
`intval8` int(11) DEFAULT NULL,
`intval9` int(11) DEFAULT NULL,
`intval10` int(11) DEFAULT NULL,
`intval11` int(11) DEFAULT NULL,
`intval12` int(11) DEFAULT NULL,
`intval13` int(11) DEFAULT NULL,
`intval14` int(11) DEFAULT NULL,
`intval15` int(11) DEFAULT NULL,
`intval16` int(11) DEFAULT NULL,
`intval17` int(11) DEFAULT NULL,
`intval18` int(11) DEFAULT NULL,
`intval19` int(11) DEFAULT NULL,
`intval20` int(11) DEFAULT NULL
)
  

Комментарии:

1. Без контекста это не поможет, у вас может быть одна таблица с более чем 100 столбцами… но если связь с базой данных и другими коррелированными таблицами (например, таблицами поиска), вы можете сразу выстрелить себе в ногу… Посмотрите на гильдии по нормализации данных.

Ответ №1:

Любой добавляемый вами индекс будет замедлять вставки и обновления значений в индексированных столбцах, поскольку индексы необходимо будет обновлять. (Это может быть компенсировано ускорением обновлений, использующих предложение WHERE.)

В противном случае единственный способ ответить на ваш вопрос — узнать, какие запросы будут выдаваться к таблице. Если запрос потребует от MySQL поиска строк по значению id и / или intval1 , то индекс on intval2 ничего не ускорит.

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

Ответ №2:

Правильная индексация зависит от используемых запросов (в противном случае это было бы просто автоматически), а размер индексов и их количество имеют значение. Они замедляют запись (вставка, обновление), но ускоряют выбор (выбор, обновление, удаление — поскольку они используются для разрешения предложения where для обновления / удаления).

Имейте в виду, что у вас может быть 1 индекс для многих столбцов, но его можно использовать, только если в запросе используются самые левые столбцы в индексе. Поскольку MySQL использует только 1 индекс для разрешения запроса (технически неверно, если есть условия объединения, но для простых запросов), во многих случаях составной индекс лучше. (последняя версия MySQL поддерживает index_merge с более чем 1 индексом, используемым для разрешения запроса, но все же он медленнее, чем составной индекс).

Если механизм хранения — InnoDB, и во всех столбцах вы выбираете только те столбцы, которые являются частью используемого индекса, запрос выполняется очень быстро (он известен как запрос, покрытый индексом)

Кроме того, важно учитывать, когда вы решаете, использовать ли вам индекс или нет для определенного столбца, это избирательность индекса — среднее количество записей на уникальное значение в индексе. Если у вас есть 100 000 записей, но только 2 возможных значения и распределение около 50%: 50%, избирательность будет низкой — MySQL все равно придется сканировать около 50 000 записей. Если имеется 10 000 различных значений, избирательность высока, и это хороший показатель.

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

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