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

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

8 ответов


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


согласно http://dev.mysql.com/doc/refman/5.0/en/constraint-primary-key.html Казалось бы, это было бы неявно


хотя это было задано в 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 индексы (ПЕРВИЧНЫЙ КЛЮЧ, UNIQUE, INDEX и FULLTEXT) являются хранится в B-деревьях. Исключение составляют индексы типов пространственных данных используйте R-деревья, и таблицы памяти также поддерживают хэш-индексы.


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


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


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

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)

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

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

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

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

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


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

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

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

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