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

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


person Alex Miller    schedule 01.07.2009    source источник


Ответы (9)


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

person Emil H    schedule 01.07.2009
comment
Если первичный ключ всегда индексируется, почему люди, говоря об архитектуре / производительности базы данных, всегда советуют новичкам SQL убедиться, что их база данных правильно проиндексирована? - person tim peterson; 07.03.2013
comment
@tim: они говорят людям убедиться, что любые другие столбцы, используемые для фильтрации, группировки или сортировки, также имеют индексы. - person Emil H; 13.03.2013
comment
Не забывайте и о присоединениях! Индексированные поля соединения ускоряют работу. - person JustJohn; 26.01.2016

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

person ist_lion    schedule 01.07.2009
comment
Я нашел эту ссылку, выполнив поиск, прежде чем задать вопрос. Но мне кажется, что это не подразумевает этого или чего-то еще в этом вопросе. - person Alex Miller; 02.07.2009
comment
Страница, на которую есть ссылка в этом ответе, похоже, ничего не говорит о том, является ли первичный ключ также индексом. Страницы, на которые есть ссылки в ответе от @fyrye, более актуальны. - person George Hawkins; 16.11.2017

Несмотря на то, что этот вопрос был задан в 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 также поддерживают хэш-индексы.

person Will B.    schedule 20.12.2012

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

person Patrick Gryciuk    schedule 01.07.2009

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

person Rick    schedule 01.07.2009

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

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)
person guest    schedule 28.08.2015

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

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

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

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

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

person Masood Ul Hassan    schedule 27.07.2016

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

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

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

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

person dr_    schedule 25.11.2016

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

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

person Anshul Sharma    schedule 08.05.2020