2009-07-01 3 views

ответ

228

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

+3

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

+28

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

+11

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

8

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

10

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

29

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

+1

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

+0

Страница, связанная с этим ответом, похоже, не говорит о том, является ли первичный ключ также индексом. Страницы, связанные с [answer] (https://stackoverflow.com/a/13979135/245602) от @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 индексов (ПЕРВИЧНЫЙ КЛЮЧ, Unique, ИНДЕКС, и FULLTEXT) хранятся в B-деревьях. Исключением является то, что индексы на пространственных типах данных используют R-деревья и что таблицы MEMORY также поддерживают индексы хеширования.

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

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

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

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

  • Еще одна вещь, которую следует помнить, то есть в ситуации базы данных нашего сотрудника, состоит в том, что если столбец является переменной длиной, индексы (как и большинство 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!

Смежные вопросы