2010-02-23 1 views
1
Create Table: CREATE TABLE `category` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) NOT NULL, 
    `parent` bigint(20) unsigned DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `name` (`name`), 
    KEY `parent_idx` (`parent`), 
    CONSTRAINT `category_parent_category_id` FOREIGN KEY (`parent`) REFERENCES `category` (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 

Я не уверен, будет ли внешний ключ индексом?Нужен ли здесь указатель на `parent`?

EDIT

Я не вижу воображаемую индекс:

mysql> show index from category; 
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | 
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
| category |   0 | PRIMARY |   1 | id   | A   |   0 |  NULL | NULL |  | BTREE  |   | 
| category |   0 | name  |   1 | name  | A   |   0 |  NULL | NULL |  | BTREE  |   | 
| category |   1 | parent_idx |   1 | parent  | A   |   0 |  NULL | NULL | YES | BTREE  |   | 
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+ 
3 rows in set (0.02 sec) 
+0

@ user198729: Вы не видите другого индекса, потому что InnoDB не создаст новый индекс для внешнего ключа, если вы уже явно создали его. Если вы не создадите 'parent_idx', InnoDB создаст его для вас (с другим именем). –

ответ

0

Я не уверен, будет ли внешний ключ означают индекс?

«InnoDB требует индексов на внешних ключей и ключей ссылки, так что внешние ключи проверки могут быть быстро и не требует сканирования таблицы ... Такой индекс создается на ссылающейся таблице автоматически, если он не существует.» (Source)

Поэтому KEY parent_idx (parent) является избыточным.

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

+0

Но такой индекс не указал 'show index from table' – user198729

+0

. Вы не видите другого индекса, потому что InnoDB не создаст новый индекс для внешнего ключа, если вы уже объяснили, что уже создали. Если вы не создаете 'parent_idx', InnoDB создаст его для вас (с другим именем). –

2

В SQL Server: Внешние ключи не могут автоматически создавать индексы. Вам нужно будет явно создать индекс, в котором вы хотите. Это делается потому, что вы не обязательно хотите индексировать каждый FK, поскольку он добавит накладные расходы для вставки.

+2

Нет, InnoDB автоматически создает индекс: «InnoDB требует индексов на внешних ключах и ссылочных ключах, чтобы проверки внешнего ключа могли быть быстрыми и не требовать сканирования таблицы ... Такой индекс создается в таблице ссылок автоматически, если он не существует." Источник: http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html. SQL Server не создает индексы автоматически по внешним ключам. –

+0

Думаю, я просто предположил, что в этом отношении они будут одинаковыми. FWIW, я думаю, что поведение SQL Server лучше, поскольку оно дает больше контроля. –

1

Да, вы правы.

KEY parent_idx ( родительский ) является избыточным индексом.

MySQL автоматически создаст индекс для ограничения FOREIGN KEY.

Из инструкции MySQL:

InnoDB создает индекс для внешнего ключа , он использует имя_индекс для названия индекса.

http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

+0

Но я не вижу индекс с индексом show show from table. – user198729