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

202

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

Теги:
database
key
indexing

8 ответов

236
Лучший ответ

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

  • 4
    Если первичный ключ всегда индексируется, почему люди, когда говорят об архитектуре / производительности базы данных, всегда советуют новичкам SQL «убедиться, что их база данных правильно проиндексирована»?
  • 33
    @tim: Они просят людей убедиться, что любые другие столбцы, используемые для фильтрации, группировки или сортировки, также имеют индексы.
Показать ещё 1 комментарий
28

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

  • 1
    Я нашел эту ссылку, выполнив поиск, прежде чем задал вопрос. Но это, кажется, не подразумевает этого или чего-то еще в этом вопросе для меня.
  • 0
    Страница, на которую ссылается этот ответ, похоже, ничего не говорит о том, является ли первичный ключ также индексом. Страницы, на которые есть ссылка в ответе @fyrye, более актуальны.
12

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

10

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

8

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

6

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

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)
3

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

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

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

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

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

1

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню