Краткий обзор индексов и постгрес - PullRequest
3 голосов
/ 22 августа 2011

У меня есть три столбца в таблице: год, pid (целое число) и код (varchar). Хочу проиндексировать каждый. Что лучше (я использую postgres, но мне интересно узнать о системах в целом): пройти все CREATE INDEX myidx ON mytable USING btree (year, pid, code); или перейти btree индивидуальный индекс на каждые три столбца?

Каковы последствия этих двух подходов?

Ответы [ 2 ]

2 голосов
/ 23 августа 2011

Разница между ними заключается в следующем. Предположим, у вас есть столбцы A, B, C и вы поместили один комплексный индекс именно в этом порядке. теперь, когда вы делаете

 SELECT * from table where A = .. AND B = .. AND C = 

тогда будет использоваться индекс, и это наиболее эффективное использование этого индекса.

если у вас есть запрос

SELECT * from table where A = ..

тогда индекс все равно будет использоваться. Однако idnex не будет (обновлено благодаря комментарию: или только частично для 2-го и 3-го примера) использоваться в:

SELECT * from table where B ..
SELECT * from table where A = .. AND C = .. AND B = ..
SELECT * from table where A = .. AND C = ..

однако снова будет использоваться в:

SELECT * from table where A = .. AND B = ..

надеюсь, это поможет. Порядок КЛЮЧ здесь. Ну и конечно то что нужно. Если у вас есть три запроса, например

SELECT * ... where A
SELECT * ... where B
SELECT * ... where C

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

2 голосов
/ 23 августа 2011

Не создавайте индексы для случайных столбцов, всегда создавайте их в соответствии с тем, как вы используете таблицу. То есть если вы будете использовать запрос типа SELECT ... WHERE year = 2011 AND pid = 2, создайте индекс для (год, pid). Индекс позволяет выполнять некоторые запросы более эффективно, но он также занимает место на диске и замедляет вставки.

Вы можете получить общее представление о том, какие индексы хороши, прочитав 3 способа, которыми MySQL использует индексы и Индексы в MySQL (две короткие публикации в блоге, объясняющие, как MySQL обрабатывает индексы). Просто помните, что каждая СУБД будет работать по-своему.

Что лучше

Единственно верный ответ - это зависит от сценариев использования, объема хранимых данных, избирательности столбцов, ...).

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