Вам нужно явно создать индекс или он неявный при определении первичного ключа? Одинаков ли ответ для MyISAM и InnoDB?
Вам нужно явно создать индекс или он неявный при определении первичного ключа? Одинаков ли ответ для MyISAM и InnoDB?
Ответы:
Первичный ключ всегда индексируется. Это то же самое для 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, и в любом виде сортировки, например, «сортировать по». Возможно, вы работаете с более сложной базой данных, поэтому хорошо запомнить несколько простых правил.
Индексы ускоряются, где пункты и порядок по. Не забудьте подумать, КАК ваши данные будут использоваться при создании таблиц. Есть еще несколько вещей, которые нужно запомнить. Если ваша таблица очень маленькая, т. Е. Всего несколько сотрудников, то хуже использовать индекс, чем не указывать его и просто позволить ему сканировать таблицу.
Индексы действительно пригодятся только для таблиц с большим количеством строк.
Еще одна вещь, о которой следует помнить, это является недостатком в ситуации с базой данных нашего сотрудника, это то, что, если столбец имеет переменную длину, индексы (а также большая часть 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
!
Можно рассматривать столбец первичного ключа как любой другой индексированный столбец с ограничениями первичного ключа.
В большинстве случаев нам нужен как первичный ключ, так и индексированные столбцы / столбцы в таблице, потому что наши запросы к таблице могут фильтровать строки на основе столбца / столбцов, который не является первичным ключом, в этом случае мы обычно индексируем эти столбцы / столбцы. также.