pt-duplicate-key-checker的功能是查找出MySQL表中的重复索引和外键。
用法如下:
pt-duplicate-key-checker [OPTIONS] [DSN]
pt-duplicate-key-checker通过检查MySQL表来查找重复或者冗余的索引和外键。连接参数读取自MySQL配置文件。
pt-duplicate-key-checker --host host1
该程序检查MySQL表的“ SHOW CREATE TABLE ”查询输出:如果发现索引间以相同的次序覆盖相同的字段或者最左前缀部分字段,就打印出可疑的索引。默认情况下,索引必须是相同的类型。即即便有相同的索引字段,一个BTREE索引和一个FULLTEXT索引并不互相重合。这可以忽略。
该程序也查找重复外键。重复外键间覆盖同一张表的相同字段,并引用相同的父表。
程序输出的结尾是一个简短的小结,包括以字节计的重复索引所占用的总空间大小的预估。计算方式为索引宽度乘以各个表中的记录数量。
以下为个人本地环境的测试数据。
首先建张示例表,包括若干冗余索引。
CREATE TABLE `player`.`player` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`number` INT(10) UNSIGNED NOT NULL COMMENT 'player number',
`name` VARCHAR(15) NOT NULL COMMENT 'player name',
`role` VARCHAR(15) NOT NULL COMMENT 'player role',
PRIMARY KEY (`id`),
INDEX `number_name_role` (`number`, `name`, `role`),
INDEX `number_name` (`number`, `name`),
INDEX `number` (`number`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
;
然后终端命令行跑一下pt-duplicate-key-checker。
root@ubuntu:~# pt-duplicate-key-checker -h192.168.112.129 -P3306 -uroot -p123456
# ########################################################################
# player.player
# ########################################################################
# number_name is a left-prefix of number_name_role
# Key definitions:
# KEY `number_name` (`number`,`name`),
# KEY `number_name_role` (`number`,`name`,`role`),
# Column types:
# `number` int(10) unsigned not null comment 'player number'
# `name` varchar(15) not null comment 'player name'
# `role` varchar(15) not null comment 'player role'
# To remove this duplicate index, execute:
ALTER TABLE `player`.`player` DROP INDEX `number_name`;
# number is a left-prefix of number_name_role
# Key definitions:
# KEY `number` (`number`)
# KEY `number_name_role` (`number`,`name`,`role`),
# Column types:
# `number` int(10) unsigned not null comment 'player number'
# `name` varchar(15) not null comment 'player name'
# `role` varchar(15) not null comment 'player role'
# To remove this duplicate index, execute:
ALTER TABLE `player`.`player` DROP INDEX `number`;
# ########################################################################
# Summary of indexes
# ########################################################################
# Size Duplicate Indexes 25
# Total Duplicate Indexes 2
# Total Indexes 35
root@ubuntu:~#
可以看出输出结果比较翔实,两个较于`number_name_role`的冗余索引`number_name`和`number`都找了出来,而且包含没有注释掉的用于删除重复索引的DDL。小结部分给出索引总大小(Total Indexes)为35(包括1个primary key和3个secondary index),其中冗余索引的大小(Size Duplicate Indexes)为25,冗余索引数量(Total Duplicate Indexes)为2个。
参考:
https://www.percona.com/doc/percona-toolkit/LATEST/pt-duplicate-key-checker.html