我正在审核一个现成的电子商务应用程序使用的 MySQL 数据库的模式,我发现这是输出SHOW CREATE TABLE thistable
:
CREATE TABLE `thistable`
(
`case_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`company_id` int(11) NOT NULL DEFAULT '0',
(...)
`timestamp` int(11) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`case_id`),
KEY `idx_case_id` (`case_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=21688281 DEFAULT CHARSET=utf8
它显式地在主键上添加索引。
这是数据库设计者的失误,还是真的有原因?
值得注意的是,这张表起源于 MyISAM。
不,显然没有充分的理由。
很可能该索引最初包含另一个已删除的列 - 至少,这是我脑海中唯一的解释。
下面是 SQL Server 使用索引而不是聚簇索引的几个原因。(我是一个 SQL Server 的人,所以如果 MySQL 的语法略有不同,我会把它留给 MySQL 的人来编辑。)
在这里,SQL Server 选择仅对 case_id 使用较窄的索引,因为扫描它比扫描整个表(及其所有相关字段)更快。
即使不涉及 case_id 的查询也会发生同样的事情:
这也使用表可用的最窄索引,在本例中为 case_id 上的索引。
这两个示例都不是为了展示良好的代码实践,而只是为了展示数据库引擎实际选择使用该索引的场景。对于第二个查询,我可以通过在任何其他字段上建立索引来解决它(因为我可能无论如何都需要在不同列上建立索引。)