我正在使用 MySQL Workbench 中的 InnoDB MySQL 数据库,并且卡在一个表的索引上。
我有一张 table
╔═══════════════╗
║ poll_votes ║
╟───────────────╢
║pk poll_id fk║ //references polls.id
║pk voter_id fk║ //references users.id
║ option_id fk║ //references poll_options.id
╚═══════════════╝
由于主键是组合键,MySQL会自动为poll_id和voter_id生成多列索引。由于每个外键都必须有一个关联索引,MySQL 进一步生成了 3 个额外的索引对应 3 个列。
现在我在一个包含 3 列的表上有 4 个索引,MySQL Workbench 不允许我删除其中任何一个,即使其中一个是多余的。此外,我永远不需要 option_id 索引,所以那只是在浪费空间。
索引多于列是否会对我造成伤害,还是我不应该担心?有没有更好的方法来设计这个表?
编辑:SQL(我编辑了一些字段名称,所以这里可能有错字):
CREATE TABLE `poll_votes` (
`poll_id` int(11) NOT NULL,
`voter_id` int(11) NOT NULL,
`poll_option_id` int(11) NOT NULL,
PRIMARY KEY (`poll_id`,`voter_id`),
KEY `fk_poll_votes_polls1_idx` (`poll_id`),
KEY `fk_poll_votes_poll_votes1_idx` (`poll_option_id`),
KEY `fk_poll_votes_users1_idx` (`voter_id`),
CONSTRAINT `fk_poll_votes_polls1` FOREIGN KEY (`poll_id`) REFERENCES `polls` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION,
CONSTRAINT `fk_poll_votes_poll_options1` FOREIGN KEY (`poll_option_id`) REFERENCES `poll_options` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION,
CONSTRAINT `fk_poll_votes_users1` FOREIGN KEY (`voter_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION
)
最佳答案
SET foreign_key_checks = OFF;
CREATE...
SET foreign_key_checks = ON;
(不,我不明白为什么该标志控制您遇到的问题。)
关于索引多于列的 MySQL 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30202519/