2016-10-19 15 views
1

Например, таблица FOOНужно создавать индексы для колонок с несколькими столбцами?

  id   name   type 
--------------------------------------------- 
     bigint(20) varchar(30) smallint(4) 

уникальный ключ name_type (имя, тип).

индекс будет создан для (имя, тип). Но если многие запросы включают тип типа type = aNumber, мне нужно создать индекс для типа отдельно?

Другими словами, индекс (имя, тип) включает индекс (тип)?
Как насчет mysql и oracle db?

+0

Дэйв - что сказал Хуан в своем ответе верно, но это не ответ на ваш вопрос. По крайней мере, в Oracle, составной индекс будет использоваться, если вы фильтруете по FIRST столбцу в индексе, но не если вы фильтруете ТОЛЬКО второй столбец в индексе. В вашем случае вам нужен индекс по типу. – mathguy

+0

_This_ вопрос не упоминает подстановочные знаки, поэтому я не чувствую, что вопрос _dup является релевантным. Голосование для повторного открытия. –

ответ

0

Представьте, что вы не имеете индексировать

Этот запрос нужно будет сканировать всю таблицу, чтобы найти 'somename'

SELECT * 
FROM yourTable 
WHERE name = 'somename' 

Теперь представьте, у вас есть индекс для name, тот же запрос будет использовать индекс, чтобы быстро найти вхождения somename, но затем придется вернуться к таблице, чтобы найти остальную часть поля.

И, наконец, если у вас есть составной индекс с (name, type) и следующий запрос.

SELECT type 
FROM yourTable 
WHERE name = 'somename' 

Вы найдете очень быстро someone, и вы уже будете иметь type, потому что является частью индекса и не нужно делать услуги для покупателей искать на столе.

Так здорово, но в чем же проблема? Компонентному индексу нужно больше пространства db и делать вставки медленнее. Так что вы должны это сделать.

+0

Его вопрос: «Будет создан индекс для (имя, тип). Но если многие запросы включают тип типа type = aNumber, мне нужно создать индекс для типа отдельно?» – Drew

+0

@ Дрю Ну я думаю, что я отвечаю на это. В моем примере показан составной ключ и выполняется поиск одного поля. Итак, короткий ответ - нет, не нужно создавать еще один индекс –

+0

innodb предполагается, выглядит как танки для меня http://i.imgur.com/nxzxKn9.jpg – Drew

1

Эти правила применимы к MySQL. Возможно, применяются к другим поставщикам.

INDEX(name, type) (или UNIQUE(name, type)) полезен для

WHERE name = ... 
WHERE name = ... AND type = ... 
WHERE name = ... AND something_else = ... 
WHERE name LIKE 'Abc%'   -- note: does not start with wildcard 
WHERE name BETWEEN 'x' AND 'y' 
WHERE name = '123'  -- both are strings 

но не полезно для

WHERE type = ...  -- without `name` 
WHERE name LIKE '%xyz' -- because of _leading_ wildcard 
WHERE name BETWEEN 'x' AND 'y' AND type = ... -- Only partially useful 
WHERE name = 123  -- trouble between VARCHAR and number 

Примечание: Порядок статей в и в WHERE не имеет значения; порядок столбцов имеет значение.

Так что «Но если многие запросы включают тип типа type = aNumber, мне нужно создать индекс для типа отдельно?» - необходим дополнительный индекс , если у вас также нет name = constant.

И «Другими словами, индекс (имя, тип) включает индекс (тип)?» - Нет, это не «включено».

Смотрите также: Index Cookbook

 Смежные вопросы

  • Нет связанных вопросов^_^