Как добавить индексы в таблицы MySQL? - PullRequest
379 голосов
/ 09 июня 2010

У меня очень большая таблица MySQL с около 150 000 строк данных. В настоящее время, когда я пытаюсь запустить

SELECT * FROM table WHERE id = '1';

код работает нормально, так как поле ID является основным индексом. Однако недавно, для разработки проекта, мне пришлось искать в базе данных по другому полю. Например

SELECT * FROM table WHERE product_id = '1';

Это поле ранее не индексировалось, однако я добавил его в качестве индекса, но когда я пытаюсь выполнить вышеуказанный запрос, результаты очень медленные. Запрос EXPLAIN показывает, что для поля product_id нет индекса, когда я его уже добавил, и в результате запрос занимает от 20 до 30 минут, чтобы вернуть одну строку.

Мои полные результаты EXPLAIN:

| id | select_type | table | type | possible_keys        | key  | key_len | ref  | rows      | Extra       |
+----+-------------+-------+------+----------------------+------+---------+------+------+------------------+
|  1 | SIMPLE      | table | ALL  | NULL                 | NULL | NULL    | NULL |    157211 | Using where |
+----+-------------+-------+------+----------------------+------+---------+------+------+------------------+

Может быть полезно отметить, что я только что посмотрел, и поле ID хранится как INT, тогда как поле PRODUCT_ID хранится как VARCHAR. Может ли это быть источником проблемы?

Ответы [ 6 ]

562 голосов
/ 09 июня 2010
ALTER TABLE `table` ADD INDEX `product_id` (`product_id`)

Никогда не сравнивайте integer с strings в MySQL.Если id равно int, удалите кавычки.

143 голосов
/ 03 мая 2013
ALTER TABLE TABLE_NAME ADD INDEX (COLUMN_NAME);
73 голосов
/ 22 мая 2014

Вы можете использовать этот синтаксис для добавления индекса и управления типом индекса (HASH или BTREE).

create index your_index_name on your_table_name(your_column_name) using HASH;
or
create index your_index_name on your_table_name(your_column_name) using BTREE;

Узнать о различиях между индексами BTREE и HASH можно здесь: http://dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html

53 голосов
/ 18 августа 2015

Стоит отметить, что несколько индексов полей могут значительно улучшить производительность вашего запроса. Таким образом, в приведенном выше примере мы предполагаем, что ProductID является единственным полем для поиска, но если запрос скажет ProductID = 1 AND Category = 7, тогда поможет индекс из нескольких столбцов. Это достигается с помощью следующего:

ALTER TABLE `table` ADD INDEX `index_name` (`col1`,`col2`)

Кроме того, индекс должен соответствовать порядку полей запроса. В моем расширенном примере индекс должен быть (ProductID, Category), а не наоборот.

45 голосов
/ 24 октября 2016

Могут быть добавлены индексы двух типов: когда вы определяете первичный ключ, MySQL будет принимать его как индекс по умолчанию.

Пояснение

Первичныйключ в качестве индекса

Предположим, у вас есть таблица tbl_student, и вы хотите student_id в качестве первичного ключа:

ALTER TABLE `tbl_student` ADD PRIMARY KEY (`student_id`)

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

Указать имя индекса

ALTER TABLE `tbl_student` ADD INDEX student_index (`student_id`)

Приведенный выше оператор создаст обычный индекс с student_index name.

Создать уникальный индекс

ALTER TABLE `tbl_student` ADD UNIQUE student_unique_index (`student_id`)

Здесь student_unique_index - это имя индекса, назначенное student_id, и создает индекс, для которого значения должны быть уникальными (здесь можно принять ноль).

Параметр полного текста

ALTER TABLE `tbl_student` ADD FULLTEXT student_fulltext_index (`student_id`)

Выше оператор создаст имя индекса полного текста с student_fulltext_index, для которого вам потребуется MyISAM Mysql Engine.

Как удалить индексы?

DROP INDEX `student_index` ON `tbl_student`

Как проверить доступные индексы?

SHOW INDEX FROM `tbl_student`
16 голосов
/ 09 июня 2010

Вы говорите, что у вас есть индекс, объяснение говорит иначе. Однако, если вы действительно это сделаете, то вот как продолжить:

Если у вас есть индекс для столбца, и MySQL решает не использовать его, это может произойти из-за:

  1. Есть еще один индекс в запросе, который MySQL считает более подходящим для использования, и он может использовать только один. Решением обычно является индекс, охватывающий несколько столбцов, если их обычный метод поиска по значению более одного столбца.
  2. MySQL решает, что есть много подходящих строк, и считает, что сканирование таблицы, вероятно, быстрее. Если это не так, иногда помогает ANALYZE TABLE.
  3. В более сложных запросах он решает не использовать его на основе чрезвычайно интеллектуального продуманного вуду в плане запросов, который по какой-то причине просто не соответствует вашим текущим требованиям.

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

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