【发布时间】:2021-11-18 11:53:02
【问题描述】:
这是桌子:
CREATE TABLE `usersMeta` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`userId` int unsigned NOT NULL,
`metaKey` varchar(30) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
`metaValue` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`id` DESC),
UNIQUE KEY `userId_metaKey` (`userId` DESC,`metaKey`),
CONSTRAINT `fk_usersMeta_userId` FOREIGN KEY (`userId`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
键userId_metaKey 可用于外键。如果我使用mysqldump导出表结构,然后使用mysql -u user -p db < exports.sql导入,MySQL会自动添加新索引:
CREATE TABLE `usersMeta` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`userId` int unsigned NOT NULL,
`metaKey` varchar(30) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
`metaValue` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`id` DESC),
UNIQUE KEY `userId_metaKey` (`userId` DESC,`metaKey`),
KEY `fk_usersMeta_userId` (`userId`),
CONSTRAINT `fk_usersMeta_userId` FOREIGN KEY (`userId`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
它添加了fk_usersMeta_userId,这是不必要的。我怎样才能防止这种情况发生?
【问题讨论】:
-
请告诉我们需要
DESC的查询。如果它没有伤害,你也许可以摆脱它。您使用的是什么版本的 MySQL?此外,是否有任何充分的理由拥有id?看来UNIQUE键可以提升为PK。 (这可能会加快你的应用程序。) -
这是否能解决出现额外索引的问题?例如。 DESC 导致 MySQL 无法识别索引?
-
这是第 8 版。
-
是的,我怀疑
DESC吓跑了比尔引用的“如果它不存在”条款。使用和不使用 DESC 都应该很容易进行实验。然后在 bugs.mysql.com 提交错误报告。 -
有道理,将其更改为
FOREIGN KEY (userId` DESC)` 修复了它,即使我认为这没有任何作用
标签: mysql indexing foreign-keys