我使用以下语法创建表:
CREATE TABLE movies_genres
(
id BIGINT AUTO_INCREMENT,
movie_id INT NOT NULL,
genre_id INT NOT NULL,
PRIMARY KEY (id),
CONSTRAINT `fk_movie_id` FOREIGN KEY (movie_id) REFERENCES movies(id),
CONSTRAINT `fk_genre_id` FOREIGN KEY (genre_id) REFERENCES genres(id),
CONSTRAINT unique_id_pair UNIQUE(movie_id, genre_id)
);但是,我看到了MySQL工作台中有关表的信息:
CREATE TABLE `movies_genres` (
`id` bigint NOT NULL AUTO_INCREMENT,
`movie_id` int NOT NULL,
`genre_id` int NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `unique_id_pair` (`movie_id`,`genre_id`),
KEY `fk_genre_id` (`genre_id`),
CONSTRAINT `fk_genre_id` FOREIGN KEY (`genre_id`) REFERENCES `genres` (`id`),
CONSTRAINT `fk_movie_id` FOREIGN KEY (`movie_id`) REFERENCES `movies` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci为什么这一行代码会生成?
KEY `fk_genre_id` (`genre_id`)我还看到额外的索引是我没有订购的.
发布于 2022-02-13 15:04:04
https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html说:
MySQL需要对外键和引用键进行索引,这样外键检查就可以快速而不需要表扫描。在“引用”表中,必须有一个索引,其中将外键列按相同顺序列为第一列。这样的索引在不存在的引用表上自动创建。
(强调地雷)
发布于 2022-02-15 23:14:28
(比尔给出了答案,这提供了另一个提示。)
去掉表中的id并更改为以下两个索引:
PRIMARY KEY (`movie_id`,`genre_id`),
KEY `fk_genre_id` (`genre_id`),这将使您对这个多到多表的一些使用更快。它还会缩小表的大小。
(如果需要id )
由于单行删除和更新需要id,所以保留id,但请使用
PRIMARY KEY (id)
INDEX(`movie_id`, `genre_id`),
INDEX(`genre_id`, `movie_id`),PK将继续使Delete/Update高效;其他两个索引将使多到多的连接高效。
https://stackoverflow.com/questions/71101794
复制相似问题