1

我使用了以下创建语句:

CREATE TABLE `subscr` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `media_id` int(11) NOT NULL,
 `user_id` int(11) NOT NULL,
 `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
 PRIMARY KEY (`id`),
 UNIQUE KEY (`media_id`, `user_id`),
 CONSTRAINT FOREIGN KEY (`media_id`) REFERENCES `media` (`id`) ON DELETE CASCADE,
CONSTRAINT FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB

为什么 InnoDB 只在 user_id 上放一个索引?我认为它需要所有外键引用的索引。

CREATE TABLE `subscr` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `media_id` int(11) NOT NULL,
 `user_id` int(11) NOT NULL,
 `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
 PRIMARY KEY (`id`),
 UNIQUE KEY `media_id` (`media_id`,`user_id`),
 KEY `user_id` (`user_id`),
 CONSTRAINT `subscriptions_media_ibfk_1` FOREIGN KEY (`media_id`) REFERENCES `media` (`id`) ON DELETE CASCADE,
 CONSTRAINT `subscriptions_media_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB
4

1 回答 1

1

media_id 也有一个索引,而且它是唯一的。它对于 MySQL 来说已经足够了。只是为 user_id 创建了一个单独的索引,因为唯一索引中的 user_id 是第二个,因此它对外键没有用处。

于 2012-06-15T22:43:51.447 回答