it-roy-ru.com

Первичный ключ автоматически индексируется в MySQL?

Вам нужно явно создать индекс или он неявный при определении первичного ключа? Одинаков ли ответ для MyISAM и InnoDB?

227
Alex Miller

Первичный ключ всегда индексируется. Это то же самое для MyISAM и InnoDB, и в целом верно для всех механизмов хранения, которые поддерживают индексы.

268
Emil H

Согласно http://dev.mysql.com/doc/refman/5.0/en/constraint-primary-key.html может показаться, что это неявно

29
PSU_Kardi

Несмотря на то, что это было задано в 2009 году, я решил опубликовать фактическую ссылку на документацию MySQL по первичным ключам. http://dev.mysql.com/doc/refman/5.5/en/optimizing-primary-keys.html

Первичный ключ для таблицы представляет столбец или набор столбцов, которые вы используете в своих наиболее важных запросах. У него есть связанный индекс для быстрой обработки запросов

Ссылку на MySQL 5.0 смотрите: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

Большинство индексов MySQL ( PRIMARY KEY , UNIQUE, INDEX и FULLTEXT) хранятся в B-деревьях. Исключением является то, что индексы для пространственных типов данных используют R-деревья, и что таблицы MEMORY также поддерживают хеш-индексы.

15
fyrye

Первичный ключ неявно индексируется как для MyISAM, так и для InnoDB. Вы можете проверить это с помощью EXPLAIN в запросе, который использует первичный ключ.

10
Patrick Gryciuk

Вам не нужно явно создавать индекс для первичного ключа ... это делается по умолчанию.

8
Rick

Я думаю, что это ответ

mysql> create table test(id int primary key, s varchar(20));
Query OK, 0 rows affected (0.06 sec)

mysql> show indexes from test \G
*************************** 1. row ***************************
        Table: test
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
1 row in set (0.00 sec)
7
guest

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

  • Индексы замедляют вставки и обновления, поэтому вы должны осторожно использовать их в столбцах, которые обновляются ЧАСТО.
  • Индексы ускоряются, где пункты и порядок по. Не забудьте подумать, КАК ваши данные будут использоваться при создании таблиц. Есть еще несколько вещей, которые нужно запомнить. Если ваша таблица очень маленькая, т. Е. Всего несколько сотрудников, то хуже использовать индекс, чем не указывать его и просто позволить ему сканировать таблицу.

  • Индексы действительно пригодятся только для таблиц с большим количеством строк.

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

  • Не забывайте и о присоединениях! Индексированные поля объединения ускоряют процесс.

4
Masood Ul Hassan

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

Например, если вы создали таблицу как таковую

CREATE TABLE mytable (foo INT NOT NULL PRIMARY KEY, bar INT NOT NULL, baz INT NOT NULL,
  UNIQUE(foo), INDEX(foo)) ENGINE=InnoDB;

поскольку вы хотите проиндексировать первичный ключ и применить к нему ограничение уникальности, вам действительно придется создать три индекса для foo!

1
dr01