Write by lyc at 2019-11-11
Percona Toolkit使用测试(4)PT-DUPLICATE-KEY-CHECKER

pt-duplicate-key-checker

  • pt-duplicate-key-checker 检查重复的索引,给出删除意见。
  • 检查MySQL表上SHOW CREATE TABLE的输出,如果它发现与另一个索引以相同顺序覆盖相同列的索引,或者覆盖另一个索引的最左端前缀,它就输出可疑的索引。
  • 默认情况下,索引必须具有相同的类型,因此BTREE索引和全文索引不算重复,即使它们具有相同的列。您可以覆盖它
  • 它还查找重复的外键。一个重复的外键与同一个表中的另一个外键覆盖相同的列,并引用相同的父表。
  • 输出以一个简短的摘要结束,其中包括对重复索引使用的总大小(以字节为单位)的估计。这是通过将索引长度乘以它们各自表中的行数来计算的。
  • pt-duplicate-key-checker在判断的时候尽可能的让组合索引保持下来。

参数说明

  • --all-structs 比较不同结构(BTREE、HASH等)的索引。默认情况下,这是禁用的,因为与全文索引覆盖相同列的BTREE索引实际上并不算是重复的

查看指定库的重复索引

1
2
3
4
5
6
7
8
$ pt-duplicate-key-checker \
--user=root \
--password=123456 \
--host=192.168.xxx.xxx \
--port=3306 \
--all-structs \
--charset=utf8 \
--databases=DATABASE_NAME,TABLE_NAME > /data/3306.txt

查看分析结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ head -50 3306.txt 
# ########################################################################
# DATABASE_NAME.bizhi_mininewbiemission_tb
# ########################################################################

# SelectUserID is a duplicate of UserID
# Key definitions:
# KEY `SelectUserID` (`UserID`)
# UNIQUE KEY `UserID` (`UserID`),
# Column types:
# `userid` int(11) default '0' comment '用户id'
# To remove this duplicate index, execute: # 优化建议
ALTER TABLE `DATABASE_NAME`.`TABLE_NAME` DROP INDEX `SelectUserID`; # 优化sql


....

# ########################################################################
# Summary of indexes
# ########################################################################

# Size Duplicate Indexes 179255206 # 重复索引占用的大小
# Total Duplicate Indexes 36 # 重复索引的数量
# Total Indexes 903 # 索引的总数量