我正在尝试通过删除冗余密钥来优化表的模式。 percona工具包和common_schema都告诉我以下密钥是多余的:
mysql> SELECT redundant_index_name, sql_drop_index FROM redundant_keys;
+----------------------+-------------------------------------------------------------------------------+
| redundant_index_name | sql_drop_index |
+----------------------+-------------------------------------------------------------------------------+
| deviceName | ALTER TABLE `reporting`.`tbCardData` DROP INDEX `deviceName` |
+----------------------+-------------------------------------------------------------------------------+
1 rows in set (0.18 sec)
mysql> show create table `reporting`.`tbCardData`;
CREATE TABLE `tbCardData` (
`pkCardDataId` bigint(12) unsigned NOT NULL AUTO_INCREMENT,
`deviceName` varchar(64) DEFAULT NULL,
`shelfId` smallint(3) unsigned DEFAULT NULL,
`cardId` smallint(3) unsigned DEFAULT NULL,
`cardName` varchar(64) DEFAULT NULL,
`cardType` smallint(3) unsigned DEFAULT NULL,
`cardSubType` smallint(3) unsigned DEFAULT NULL,
`cardSpareGroupId` smallint(3) unsigned DEFAULT NULL,
`cardSerialNum` varchar(64) DEFAULT NULL,
`cardCarrierSerialNum` varchar(64) DEFAULT NULL,
`dom` tinyint(2) unsigned NOT NULL DEFAULT '0',
`updateTime` int(11) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`pkCardDataId`),
UNIQUE KEY `devchascarddom` (`deviceName`,`shelfId`,`cardId`,`dom`),
KEY `deviceName` (`deviceName`),
KEY `dom` (`dom`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
我知道deviceName Key和唯一键devchascarddom共享最左边的属性deviceName,但在我看来,Unique Key出现一次,而列表中有几个deviceNames。我想我所说的是,删除Key deviceName对我来说似乎没有意义,但我不是mysql大师 - 我应该放弃它还是这只是这些工具报告给我的方式我我不得不放弃?
答案 0 :(得分:2)
MySQL可以像使用devchascarddom
一样使用复合索引deviceName
的第一部分。这些工具告诉你实话。 deviceName
索引会更小,如果你可以摆脱devchascarddom
,那就更好了。您必须查看查询的EXPLAIN
输出,看看是否可能。
答案 1 :(得分:0)
它说如果它需要一个关于devicename的索引,它会使用复合唯一键devchascarddom来获取它,大概是因为该索引本身会被devicename索引。 请注意,我不知道这是否属实,但它比复制每个成员更有意义。 e.g。
Device1
Shelf1
Card1
dom1
dom2
等。 现在如果你在Shelf上有一个索引就不会说它是多余的。