Percona Toolkit使用测试(4)PT-DUPLICATE-KEY-CHECKER

pt-duplicate-key-checker——查找MySQL表上的重复索引和外键。
pt-duplicate-key-checker检查MySQL表中的重复或冗余索引和外键。

连接配置从MySQL配置文件中读取。
如:pt-duplicate-key-checker --host host1

这个程序检查MySQL表上SHOW CREATE TABLE的输出,如果它发现与另一个索引以相同顺序覆盖相同列的索引,或者覆盖另一个索引的最左端前缀,它就输出可疑的索引。

默认情况下,索引必须具有相同的类型,因此BTREE索引和全文索引不算重复,即使它们具有相同的列。您可以覆盖它

它还查找重复的外键。一个重复的外键与同一个表中的另一个外键覆盖相同的列,并引用相同的父表。

输出以一个简短的摘要结束,其中包括对重复索引使用的总大小(以字节为单位)的估计。这是通过将索引长度乘以它们各自表中的行数来计算的。

参数:
这个工具接受额外的命令行参数
- -all-structs
比较不同结构(BTREE、HASH等)的索引。默认情况下,这是禁用的,因为与全文索引覆盖相同列的BTREE索引实际上并不算是重复的
这个参数测试没有成功:
在这里插入图片描述
- -ask-pass
连接时询问mysql密码
- -charset
字符集 -A 简写
- -[no]clustered
默认yes
附加到辅助键的主键列是重复的。
检测辅助键的后缀何时为主键的最左前缀,并将其视为重复键。仅在主键是集群的存储引擎上检测此情况(当前为InnoDB和solidDB)。

集群存储引擎无论如何都会将主键列附加到所有辅助键的叶子节点上,因此您可能认为在内部节点中出现它们也是多余的。当然,您也可能希望它们位于内部节点中,因为仅将它们放在叶子节点上对某些查询没有帮助。不过,它确实有助于覆盖索引查询。

下面是一个键的例子,这个选项被认为是多余的:
在这里插入图片描述
这种索引的使用相当微妙。例如,假设您有以下查询:
SELECT … WHERE b=1 ORDER BY a;
如果我们删除b,a上的索引,这个查询将执行文件排序。但是,如果我们将(b,a)索引缩短为b,并删除ORDER BY,查询应该返回相同的结果。
该工具将会通过删除集群索引并添加一个去掉主键缀的索引来缩短集群键,缩短之后的集群键仍然可能和其他的键重复,因此,如果您缩短任何重复的集群键,您应该再次运行该工具。
例:percona表拥有索引name_2(name,id(PK)) ,索引name(name)
在这里插入图片描述
生成出的sql语句为:
ALTER TABLE percona.users DROP INDEX name_2, ADD INDEX name_2 (name);
那么缩短之后的key name_2将和key name重复

- -config
读取这个逗号分隔的配置文件列表;如果指定,这必须是命令行上的第一个选项。
- -databases
简写 -d 只检查这个逗号分隔的数据库列表。
- -defaults-file
简写 -F 只读取给定文件中的mysql配置。您必须给出一个绝对路径名。
- -engines
简写 -e 只检查存储引擎位于此逗号分隔列表中的表。
- -help
帮助并退出
- -host
简写 -h 连接主机名/ip
- -ignore-databases
忽略这个逗号分隔的数据库列表
- -ignore-engines
忽略这个逗号分隔的存储引擎列表
- -ignore-order
忽略索引顺序 KEY(a,b) 与KEY(b,a)重复.
- -ignore-tables
忽略这个以逗号分隔的表列表。表名可以用数据库名限定。
- -key-types
type: string; default: fk
Check for duplicate f=foreign keys, k=keys or fk=both.
检查外键/索引/所有key类型
- -password
连接使用的密码
- -pid
创建给定的PID文件。如果PID文件已经存在并且其中包含的PID与当前PID不同,则该工具不会启动。但是,如果PID文件存在并且其中包含的PID不再运行,则该工具将用当前PID覆盖PID文件。当工具退出时,PID文件将自动删除。
- -port
简写-P 数据库连接端口
- -set-vars
在这个以逗号分隔的(变量=值)列表中设置MySQL变量
- -socket
连接使用的socket文件
- -[no]sql
默认 yes
为每个重复键打印DROP键语句。默认情况下,ALTER TABLE DROP KEY语句打印在每个重复键的下面,这样,如果您想删除重复键,就可以将该语句复制粘贴到MySQL中。

要禁用打印这些语句,请指定- -no-sql。
- -[no]summary
默认 yes
在输出结束时打印索引摘要。
- -tables
-t 简写
只检查这个以逗号分隔的表列表。
表名可以用数据库名限定。
- -user
连接使用的用户 -u
- -verbose
-v 输出所有找到的键和/或外键,而不仅仅是多余的键。
- -version
展示版本并退出
- -[no]version-check
检查程序版本

示例:
CREATE TABLE users (
id bigint(20) NOT NULL,
name varchar(255) COLLATE utf8_bin NOT NULL,
password varchar(255) COLLATE utf8_bin DEFAULT NULL,
email varchar(255) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE KEY name (name) USING BTREE,
KEY name_1 (name,password) USING BTREE,
KEY name_2 (name,password,email) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

pt-duplicate-key-checker  --host=10.10.80.16 --user=root --password=123456 --port=5000 -d percona --all-structs

在这里插入图片描述
由于name索引是唯一索引,所以不与普通索引做重复对比
由于name2索引包含了name1索引,所以生成删除name1索引语句
pt-duplicate-key-checker在判断的时候尽可能的让组合索引保持下来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值