2017-02-12 4 views
3
SELECT * 
FROM Movies 
WHERE studioName = ‘Disney’ AND year = 1990; 

Насколько каждый из этих индексов поможет?Понимание основы индекса в SQL

CREATE INDEX YearIndex ON Movies(year); 
CREATE INDEX StudioIndex ON Movies(studioName); 
CREATE INDEX YSIndex ON Movies(year,studioName); 
CREATE INDEX SYIndex ON Movies(studioName,year); 

Насколько каждый индекс поможет, если предложение WHERE было год = 1990?

Создание индекса на год действительно поможет, потому что существует много лет, в течение которого были созданы фильмы, поэтому поиск был бы существенно сведен к минимуму.

Studioname 

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

year,studioname 

является лучшим выбором в этом случае, так как очевидно, поиск минимизируется больше, чем два предыдущих

studioname,year 

это хорошо, но не так хорошо, как и предыдущий.

Сколько будет помогать каждый из индексов, если предложение WHERE было годом < 1990?

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

Это правильный способ подумать об этом?

+0

(year, studioName) и (studioName, year) индексы, вероятно, эквивалентны, если вы просматриваете их оба, и, по крайней мере, в Postgres, поиск по первому столбцу индекса лишь немного эффективнее, чем поиск по второй (потому что он может читать префиксы индексов). Не уверен, что означает «все годы меньше 1990 года». – Ryan

+0

Какая СУБД? Насколько велика таблица фильмов? Какова мощность каждого из предлагаемых индексов? – cschneid

+0

Все годы меньше 1990 мм. Я думаю, что использование слова каждый из них исправит неправильно.«Каждый год меньше 1990 года» – daniel

ответ

2

Вы правы, индекс на (year, studioName) является лучшим. Это позволяет быстро искать, когда у вас есть условия для обеих столбцов.

Если у вас есть второй запрос, который ищет только год, но не для studioName, то тот же индекс также поможет.

Но если у вас был только указатель на (studioName, year), и вы искали только определенный год, индекс не помог бы.

Подумайте о телефонной книге. Вы можете искать людей по фамилии, потому что именно так сортируется книга. Вы также можете искать людей по имени и фамилии, а книга помогает еще больше.

Но если вы ищете только людей с заданным именем, порядок сортировки книги не очень помогает.

Вы могли бы мое выступление, How to Design Indexes, Really или видео меня, представляя его: https://www.youtube.com/watch?v=ELR7-RdU9XU

Презентация специально для MySQL, но многие идеи применимы к любой базе данных, которая реализует индексы с использованием B-древовидные структуры.

:
+0

Спасибо за ваш ответ, я обнаружил опечатку во втором вопросе. – daniel

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