MYSQL: индексное ключевое слово в таблице создания и когда ее использовать - PullRequest
42 голосов
/ 18 февраля 2009

Что означает ключевое слово index и какую функцию оно выполняет? Я понимаю, что это должно ускорить выполнение запросов, но я не очень уверен, как это можно сделать.

Когда как выбрать столбец для индексации?

Пример использования ключевого слова index показан ниже в запросе create table:

CREATE TABLE `blog_comment`
(
    `id` INTEGER  NOT NULL AUTO_INCREMENT,
    `blog_post_id` INTEGER,
    `author` VARCHAR(255),
    `email` VARCHAR(255),
    `body` TEXT,
    `created_at` DATETIME,
    PRIMARY KEY (`id`),
    INDEX `blog_comment_FI_1` (`blog_post_id`),
    CONSTRAINT `blog_comment_FK_1`
        FOREIGN KEY (`blog_post_id`)
        REFERENCES `blog_post` (`id`)
)Type=MyISAM

;

Ответы [ 2 ]

41 голосов
/ 18 февраля 2009

Я бы рекомендовал прочитать Как MySQL использует индексы из Справочного руководства MySQL . В нем говорится, что индексы используются ...

  • Чтобы быстро найти строки, соответствующие предложению WHERE.
  • Чтобы исключить строки из рассмотрения.
  • Для извлечения строк из других таблиц при выполнении объединений.
  • Чтобы найти значение MIN() или MAX() для определенного индексированного столбца.
  • Сортировка или группировка таблицы (при определенных условиях).
  • Для оптимизации запросов с использованием только индексов без обращения к строкам данных.

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

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

В вашем примере оба столбца id и blog_post_id используют индексы (PRIMARY KEY также является индексом), чтобы приложение могло быстрее их найти. В случае id вполне вероятно, что это позволяет пользователям быстро изменять или удалять комментарии, а в случае blog_post_id, поэтому приложение может быстро найти все комментарии к данному сообщению.

Вы заметите, что для столбца email нет индекса. Это означает, что поиск всех сообщений в блоге по определенному адресу электронной почты, вероятно, займет довольно много времени. Если вы хотите добавить поиск всех комментариев по определенному адресу электронной почты, возможно, имеет смысл добавить к этому также индекс.

4 голосов
/ 18 февраля 2009

Это ключевое слово означает, что вы создаете индекс для столбца blog_post_id вместе с таблицей.

Запросы, подобные этому:

SELECT *
FROM blog_comment
WHERE blog_post_id = @id

будет использовать этот индекс для поиска в этом поле и работать быстрее.

Кроме того, в этом столбце есть foreign key.

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

DELETE
FROM blog_post
WHERE ...

также будет работать быстрее.

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