Как использовать индексные столбцы MySQL? - PullRequest
14 голосов
/ 05 октября 2009

Когда вы используете каждый тип индекса MySQL?

  • ПЕРВИЧНЫЙ - Столбцы первичного ключа?
  • UNIQUE - Внешние ключи?
  • ИНДЕКС - ??

Для действительно больших таблиц индексированные столбцы улучшают производительность?

Ответы [ 5 ]

20 голосов
/ 05 октября 2009

Основной

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

Уникальная

Уникальный индекс гарантирует, что ваша СУБД не принимает повторяющиеся записи для этого столбца. Вы спрашиваете «Внешние ключи?» НЕТ! Это было бы бесполезно, поскольку внешние определения по определению могут быть дубликатами (один ко многим, многие ко многим).

Индекс

Дополнительные индексы могут быть размещены в столбцах, которые часто используются для SELECTS (и JOINS), что часто имеет место для внешних ключей. Во многих случаях запросы SELECT (и JOIN) будут выполняться быстрее, если внешние ключи проиндексированы.

Обратите внимание, что, как выяснил SquareCog, индексы обновляются при любых изменениях данных, поэтому добавление большего количества индексов может привести к снижению производительности INSERT / UPDATE. Если индексы не обновляются, вы получите различную информацию в зависимости от того, решил ли оптимизатор выполнить ваш запрос по индексу или по необработанной таблице - крайне нежелательная ситуация.

Это означает, что вы должны тщательно оценить использование индексов. На основании этого можно быть уверенным: Следует избегать неиспользуемых индексов, соответственно. удален !

3 голосов
/ 05 октября 2009

Я не очень знаком с MySQL, однако считаю, что на большинстве серверов баз данных верно следующее. Индекс - это сбалансированное дерево, которое позволяет базе данных сканировать таблицу на предмет заданных данных. Например, скажем, у вас есть следующая таблица.

CREATE TABLE person (
    id    SERIAL,
    name  VARCHAR(20),
    dob   VARCHAR(20)
);

Если вы создали индекс в поле «имя», он был бы создан в сбалансированном дереве для этих данных в таблице для столбца имени. Сбалансированные древовидные структуры данных обеспечивают более быстрый поиск результатов (см. http://www.solutionhacker.com/tag/balanced-tree/).

Следует отметить, однако, что индексирование столбца позволяет выполнять поиск только по тем данным, которые хранятся в базе данных. Например:

Это не сможет выполнить поиск по индексу и вместо этого будет выполнять последовательное сканирование таблицы, вызывая UPPER () для каждого столбца: имя строки в таблице.

select *
from person
where UPPER(name) = "BOB";

Это также будет иметь следующий эффект, поскольку индекс будет отсортирован, начиная с первой буквы. Однако замена поискового термина на «% B» будет использовать индекс.

select *
from person
where name like "%B"
2 голосов
/ 05 октября 2009

Индексы улучшат производительность на больших таблицах. Обычно первичный ключ имеет индекс, основанный на ключе. Обычно уникальный.

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

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

0 голосов
/ 05 октября 2009

Чем больше таблица, тем больше выигрыш от использования индекса. Обратите внимание, что indexes замедляет операции вставки (и, возможно, обновления), поэтому убедитесь, что вы не проиндексировали слишком много полей.

0 голосов
/ 05 октября 2009

PRIMARY определяет первичный ключ, да.

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

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

...