Вопрос по database, mysql – Первичный ключ автоматически индексируется в MySQL?

223

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

Ваш Ответ

8   ответов
263

DB, и в целом верно для всех механизмов хранения, которые поддерживают индексы.

Если первичный ключ всегда индексируется, почему люди, когда говорят об архитектуре / производительности базы данных, всегда советуют новичкам SQL «убедиться, что их база данных правильно проиндексирована»?
@tim: они говорят людям, чтобы они удостоверялись, что любые другие столбцы, используемые для фильтрации, группировки или сортировки, также имеют индексы.
Не забудьте также присоединиться! Индексированные поля объединения ускоряют процесс.
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!

7

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

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

Indexes slow down inserts and updates, so you want to use them carefully on columns that are FREQUENTLY updated.

Indexes speed up where clauses and order by. Remember to think about HOW your data is going to be used when building your tables. There are a few other things to remember. If your table is very small, i.e., only a few employees, it's worse to use an index than to leave it out and just let it do a table scan.

Indexes really only come in handy with tables that have a lot of rows.

Another thing to remember, that is a con in the situation of our employee’s database, is that if the column is a variable length, indexes (as well as most of MySQL) perform much less efficiently.

Don't forget joins too! Indexed join fields speed things up.

10

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

13

что это было задано в 2009 году, я решил опубликовать фактическую ссылку на документацию MySQL по первичным ключам. http://dev.mysql.com/doc/refman/5.5/en/optimizing-primary-keys.html

The primary key for a table represents the column or set of columns that you use in your most vital queries. It has an associated index, for fast query performance

Ссылка на MySQL 5.0:http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

Most MySQL indexes (PRIMARY KEY, UNIQUE, INDEX, and FULLTEXT) are stored in B-trees. Exceptions are that indexes on spatial data types use R-trees, and that MEMORY tables also support hash indexes.

29

http://dev.mysql.com/doc/refman/5.0/en/constraint-primary-key.html Казалось бы, это было бы неявным

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

ся по умолчанию.

Похожие вопросы