Чи потрібно чітко створити індекс, або він неявний під час визначення первинного ключа? Чи однакова відповідь для 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/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 також підтримують хеш-індекси.
Первинний ключ неявно індексується як для 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)
Індекси найкраще використовувати в стовпцях, які часто використовуються там, де клаузи, та в будь-якому виді сортування, наприклад "упорядкувати за". Можливо, ви працюєте над більш складною базою даних, тому добре пам’ятати кілька простих правил.
Індекси прискорюють там, де статей і впорядкувати. Не забудьте подумати про те, як ваші дані використовуватимуться під час створення ваших таблиць. Є кілька інших речей, які слід пам’ятати. Якщо ваш стіл дуже маленький, тобто лише декілька працівників, гірше використовувати індекс, ніж залишати його, і просто нехай він сканує таблицю.
Індекси дійсно корисні лише з таблицями, які мають багато рядків.
Інша річ, яку слід пам’ятати, що полягає в ситуації, що склалася в базі даних нашого працівника, полягає в тому, що якщо стовпець має змінну довжину, індекси (як і більшість 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
!
Стовпець первинного ключа можна думати як будь-який інший індексований стовпець із обмеженнями первинного ключа, який він приносить із собою.
У більшості випадків використання нам потрібен як первинний ключ, так і індексований стовпчик / стовпці в таблиці, оскільки наші запити до таблиці можуть фільтрувати рядки на основі стовпців / стовпців, які не є первинним ключем, у цьому випадку ми зазвичай індексуємо ці стовпці / стовпці також.