一,pt-duplicate-key-checker
从CSDN上移过来的,已经不打算更新csdn了。
http://blog.csdn.net/mr_mablevi?viewmode=contents
前提:
下载地址:http://www.percona.com/redir/downloads/percona-toolkit/percona-toolkit-1.0.1.tar.gz
安装方法:perl Makefile.PL;make;make install
一:pt-duplicate-key-checker 使用
参考地址:http://www.percona.com/doc/percona-toolkit/pt-duplicate-key-checker.html
使用方法:
pt-duplicate-key-checker [OPTION...] [DSN]
使用说明:检查重复或多余的索引和外键,并打印出信息。
参数说明:加粗的为常用的。
--all-structs:
结构(B树,哈希等)的索引,默认情况下是禁止的。因为BTREE索引可能会覆盖作为FULLTEXT索引的列,其实他们不是真正
的重复,因为是不同的索引结构。
--ask-pass
提示输入密码。
--charset
缩写-A,字符集设置:utf8,gbk,latin1 …
--[no]clustered
主键和第二索引一起是重复的,默认开启。检测时的非主键索引的多列索引的后缀是一个主键最左边的前缀,则作为一个重复键。如:
PRIMARY KEY (`a`)
KEY `b` (`b`,`a`)
SELECT ... WHERE b=1 ORDER BY a;
如果按照这个工具去掉b索引,则会出现filesort,他给的意见是 留下b(b)单列索引,把order by a去掉,因为他们的结果是一样的,a是主键。
--config
读取该配置文件的列表。
--databases
只检查该列表中的数据库。
--defaults-file
缩写-F,读取Mysql的配置文件,需要绝对路径。
--engines
缩写-e,只检查该列表中指定的表的存储引擎。
--tables
缩写-t,只检查列表中指定的表。
--help
显示帮助
--host
缩写-h,连接到主机地址。
--ignore-databases
跳过检查的某些数据库。
--ignore-engines
跳过检查的某些存储引擎。
--ignore-tables
跳过检查某些表。
--ignore-order
加了这个参数会报: KEY(a,b)和 KEY(b,a) 是重复索引,默认关闭。
--key-types
检查索引的类型:f=foreignkeys, k=keys or fk=both,默认是fk。
--password
缩写-p,连接mysql时候的密码。
--user
缩写-u,连接mysql时候的用户
--pid
连接的PID
--port
缩写-P,连接时候的端口。
--socket
缩写-S,连接时候的套接字。
--[no]sql
打印出sql,如果有重复会答应出删除重复索引的sql。默认开启。
--[no]summary
打印出索引的统计信息。默认开启。
--verbose
缩写-v,打印出所有的索引信息,包括重复索引。
--version
打印版本信息。
列子说明:
create table a(id int primary key,name varchar(10),ageint);
1,create index idx_a on a(name);
2,create index idx_b on a(age);
3,create index idx_ab on a(name,age);--重复 和1
4,create index idx_p on a(age,id); --重复和2
按理说只有2个重复的索引但是图出现了3个。
打印出了索引的统计信息,还有删除重复索引的sql。
为什么会把索引4都删除掉呢,原来是因为默认开启了--[no]clustered 参数。
去掉参数的话:显示2个。
删除掉1,2,4 索引,在建立
5,create index idx_ba on a(age,name);
执行:带 --ignore-order参数
其他的各种参数上面介绍的很清楚了,比如跳过库,存储引擎,表;或则只在某个库,存储引擎,表里面进行检查。可以自行测试。