Чи первинний ключ автоматично індексується в MySQL?


243

Чи потрібно чітко створити індекс, або він неявний під час визначення первинного ключа? Чи однакова відповідь для MyISAM та InnoDB?

Відповіді:


294

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


5
Якщо первинний ключ завжди індексується, чому люди, коли говорять про архітектуру / продуктивність баз даних, завжди радять новачкам SQL "переконатися, що їх база даних правильно індексується"?
Тім Петерсон

35
@tim: Вони говорять людям переконатися, що в будь-яких інших стовпцях, які використовуються для фільтрування, групування чи сортування, також є індекси.
Еміль Н

15
Не забувайте також приєднуватися! Індексовані поля приєднання прискорюють роботу.
JustJohn

31

Згідно з http://dev.mysql.com/doc/refman/5.0/en/constraint-primary-key.html , мабуть, це буде неявним


1
Я знайшов це посилання шляхом пошуку, перш ніж я задав питання. Але це, мабуть, не означає для мене це чи щось інше.
Алекс Міллер

Сторінка, на яку посилається ця відповідь, ніби нічого не говорить про те, чи є первинним ключем також індекс. Сторінки, пов’язані у відповіді від @fyrye, є більш релевантними.
Джордж Хокінс

16

Незважаючи на те, що про це питали у 2009 році, я зрозумів, що опублікую фактичну посилання на документацію MySQL на первинні ключі. http://dev.mysql.com/doc/refman/5.5/uk/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 також підтримують хеш-індекси.


11

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


9

Не потрібно явно створювати індекс для первинного ключа ... це робиться за замовчуванням.


8

Я думаю, це відповідь

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)

7

Індекси найкраще використовувати в стовпцях, які часто використовуються там, де клаузи, та в будь-якому виді сортування, наприклад "упорядкувати за". Можливо, ви працюєте над більш складною базою даних, тому добре пам’ятати кілька простих правил.

  • Індекси сповільнюють вставки та оновлення, тож ви хочете їх обережно використовувати на стовпцях, які ВІДКЛЮЧНО оновлюються.
  • Індекси прискорюють там, де статей і впорядкувати. Не забудьте подумати про те, як ваші дані використовуватимуться під час створення ваших таблиць. Є кілька інших речей, які слід пам’ятати. Якщо ваш стіл дуже маленький, тобто лише декілька працівників, гірше використовувати індекс, ніж залишати його, і просто нехай він сканує таблицю.

  • Індекси дійсно корисні лише з таблицями, які мають багато рядків.

  • Інша річ, яку слід пам’ятати, що полягає в ситуації, що склалася в базі даних нашого працівника, полягає в тому, що якщо стовпець має змінну довжину, індекси (як і більшість MySQL) працюють набагато менш ефективно.

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


4

Первинний ключ завжди автоматично індексується та унікальний. Отже, остерігайтеся не створювати зайвих індексів.

Наприклад, якщо ви створили таблицю як таку

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

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


0

Стовпець первинного ключа можна думати як будь-який інший індексований стовпець із обмеженнями первинного ключа, який він приносить із собою.

У більшості випадків використання нам потрібен як первинний ключ, так і індексований стовпчик / стовпці в таблиці, оскільки наші запити до таблиці можуть фільтрувати рядки на основі стовпців / стовпців, які не є первинним ключем, у цьому випадку ми зазвичай індексуємо ці стовпці / стовпці також.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.