【问题标题】:Keys are reported as redundant, but are they really?键被报告为多余的,但它们真的是这样吗?
【发布时间】:2013-09-07 14:19:49
【问题描述】:

我正在尝试通过删除冗余键来优化表的架构。 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,但在我看来唯一键出现一次,而列表中有多个 deviceName。我想我要说的是,在这里删除 Key deviceName 对我来说似乎没有意义,但我不是 mysql 专家——我应该放弃它还是这只是这些工具向我报告的方式'将不得不丢弃?

【问题讨论】:

    标签: mysql indexing database-schema percona


    【解决方案1】:

    MySQL 可以像使用deviceName 一样使用复合索引的第一部分devchascarddom。这些工具告诉你真相。 deviceName 索引会更小,如果您可以摆脱 devchascarddom 反而会更好。您必须查看EXPLAIN 输出以进行查询,看看是否可行。

    【讨论】:

    • hmm - 并且 deviceName 完全包含在 devchascarddom 中。 -- 但是如果我从 tbCardData 中选择 distinct(deviceName),它将获得更多的行来查看,而不仅仅是 deviceName - 但我相信它在这张小桌子上足够高效。
    • 是的,它需要扫描包含比 deviceName 更多不同值的索引。您还可以考虑规范化为 device 表并存储 device_id。然后你的distinct(deviceName) 就变成了一个计数。
    【解决方案2】:

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

    Device1 
      Shelf1
        Card1
          dom1
          dom2
    

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

    【讨论】:

      猜你喜欢
      • 2012-05-19
      • 1970-01-01
      • 2011-01-02
      • 2013-11-21
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      • 2012-02-19
      • 1970-01-01
      相关资源
      最近更新 更多