Вам нужно явно создать индекс или это неявно при определении первичного ключа? Одинаков ли ответ для MyISAM и InnoDB?
Индексируется ли первичный ключ в MySQL автоматически?
Ответы (9)
Первичный ключ всегда индексируется. Это то же самое для 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 (PRIMARY KEY, UNIQUE, INDEX и FULLTEXT) хранятся в B-деревьях. Исключениями являются то, что индексы для пространственных типов данных используют R-деревья, и что таблицы MEMORY также поддерживают хэш-индексы.
Первичный ключ неявно индексируется как для 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, а также в любом виде сортировки, например «по порядку». Возможно, вы работаете с более сложной базой данных, поэтому хорошо запомнить несколько простых правил.
- Индексы замедляют вставку и обновление, поэтому вы хотите осторожно использовать их в столбцах, которые ЧАСТО обновляются.
Индексы ускоряют выполнение предложений where и упорядочивают их. Не забудьте подумать о том, КАК ваши данные будут использоваться при построении ваших таблиц. Следует запомнить еще несколько вещей. Если ваша таблица очень маленькая, то есть всего несколько сотрудников, хуже использовать индекс, чем не указывать его и просто позволить ему выполнить сканирование таблицы.
Индексы действительно пригодятся только в таблицах с большим количеством строк.
Еще одна вещь, о которой следует помнить, это недостаток в ситуации с базой данных наших сотрудников: если столбец имеет переменную длину, индексы (как и большая часть 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!
Столбец первичного ключа можно рассматривать как любой другой индексированный столбец с ограничениями первичного ключа.
В большинстве случаев использования нам нужны как первичный ключ, так и индексированные столбцы / столбцы в таблице, потому что наши запросы к таблице могут фильтровать строки на основе столбца / столбцов, которые не являются первичным ключом, в этом случае мы обычно индексируем эти столбцы / столбцы также.