Индексирование большой таблицы MySQL

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

id | key_1 | key_2 | ... | key_n

Может быть фильтр для одного или нескольких ключей, каждое добавление (я использую фреймворк Zend для создания запросов с помощью подготовленных операторов):

$select->where($this->_db->quoteInto('key_n = ?', $filter->key_n));

Если я правильно понял, чтобы ускорить запрос, я должен индексировать некоторые из столбцов. Поэтому это вызвало пару вопросов:

  • Имеет ли смысл добавлять индексы ко всем столбцам, которые будут использоваться для фильтрации данных?
  • Если я буду индексировать много столбцов, как это повлияет на скорость, с которой данные записываются в таблицу?
  • Имеет ли смысл добавлять индексы с комбинацией столбцов?
1 ответ

Некоторые из ответов содержат ссылки @bodi0. Но я добавлю следующее:

Имеет ли смысл добавлять индексы ко всем столбцам, которые будут использоваться для фильтрации данных?

Может быть. Обычно индекс ускоряет извлечение данных. Но в некоторых случаях это не так: если мощность индексированного столбца низкая, индекс может не дать ничего или так мало пользы, которое оптимизатор может решить проигнорировать. Подумайте о столбце "пол", например, только с двумя значениями "M" или "F". Если каждый из них относится к примерно 50% строк, индекс может обеспечить небольшое улучшение. Или, если 75% записей "М", и вы запрашиваете "М", индекс, скорее всего, вообще не будет использоваться.

Имеет ли смысл добавлять индексы с комбинацией столбцов?

Может быть. Если вы знаете, что определенная комбинация столбцов часто используется для фильтрации в одном SELECT такой индекс может оказаться полезным. Обратите внимание, что для того, чтобы индекс использовался, его первый столбец (столбцы) должен быть в критериях фильтра. Например: индекс по столбцам (gender, state) может быть использован только тогда, когда gender (и, возможно, state) используются в качестве критериев, указанных в запросе. Если только state фильтруется по индексу, не будет использоваться.

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

licensed under cc by-sa 3.0 with attribution.