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


243

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

Ответы:


294

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


5
Если первичный ключ всегда индексируется, почему люди, говоря об архитектуре / производительности базы данных, всегда советуют новичкам SQL «убедиться, что их база данных правильно проиндексирована»?
Тим Петерсон

35
@tim: Они просят людей убедиться, что любые другие столбцы, используемые для фильтрации, группировки или сортировки, также имеют индексы.
Эмиль Х

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

31

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


1
Я нашел эту ссылку, выполнив поиск, прежде чем задал вопрос. Но это, кажется, не подразумевает этого или чего-то еще в этом вопросе для меня.
Алекс Миллер

Страница, на которую ссылается этот ответ, похоже, ничего не говорит о том, является ли первичный ключ также индексом. Страницы, на которые есть ссылка в ответе @fyrye, более актуальны.
Джордж Хокинс

16

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


11

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


9

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


8

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

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

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

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

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

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

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


4

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

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

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

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


0

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.