密钥被报告为冗余,但它们真的是吗?

时间:2013-09-07 14:19:49

标签: mysql indexing database-schema percona

我正在尝试通过删除冗余密钥来优化表的模式。 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大师 - 我应该放弃它还是这只是这些工具报告给我的方式我我不得不放弃?

2 个答案:

答案 0 :(得分:2)

MySQL可以像使用devchascarddom一样使用复合索引deviceName的第一部分。这些工具告诉你实话。 deviceName索引会更小,如果你可以摆脱devchascarddom,那就更好了。您必须查看查询的EXPLAIN输出,看看是否可能。

答案 1 :(得分:0)

它说如果它需要一个关于devicename的索引,它会使用复合唯一键devchascarddom来获取它,大概是因为该索引本身会被devicename索引。 请注意,我不知道这是否属实,但它比复制每个成员更有意义。 e.g。

Device1 
  Shelf1
    Card1
      dom1
      dom2

等。 现在如果你在Shelf上有一个索引就不会说它是多余的。