因项目需要,统计index使用情况,于是谷歌了下
Currently,MySQL does not offer statistics on index usage.
One way to generate those stats on your own would be to log allqueries (Be careful of the extra i/o here) and parse it out. Percona has a nicetool for this, pt-index-usage.
pt-index-usage
名称:
pt-index-usage 从日志读取查询,并且分析index的使用;
概要:
pt-index-usage[OPTIONS] [FILES]
分析slow.log中的查询并打印报告
pt-index-usage/path/to/slow.log --host localhost
禁用报告并将结果保存到perconaDB中;
pt-index-usageslow.log --no-report --save-results-database percona
风险
备份你的数据;
描述
该工具连接mysql,读取查询日志,使用EXPLAIN来询问mysql如何使用查询。完成后会打印一份查询没有使用的索引报告;
查询日志需要使用慢查询日志格式,如果你需要不一样的格式,请用” pt-query-digest”翻译格式;如果不指定文件名,那么会从标准输入中读取;
工具运行两个阶段,第一阶段会清点库中所有表和index,因此它可以将现有的索引和查询日志中的索引进行比较。第二阶段会在每个查询日志中运行EXPLAIN,它使用单独的数据库连接来清点表并运行EXPLAIN,因此它打开两个到数据库的连接。
如果查询不是SELECT,它会将其转换为大致等效的SELECT查询,然后再EXPLAIN,这并不是完美的处理,但是已经足够用了;
当看到与以前完全相同查询的时候,会跳过EXPLAIN;它假设安全的查询将生成安全的EXPLAIN计划,通常是一个安全的假定,且对性能有好处,且简单地增加index的使用次数;然而相同的查询但是不同的checksum会再次执行EXPLAIN;具有不同字面常量的查询具有不同的执行计划,这个度很重要;
EXPLAIN执行后,要将别名转换为表名;
输出:
读取所有Log后,工具会为每个未使用的index打印drop语句;它会跳过从未访问过的表索引,以避免错误的结果;
如果你不使用—quiet,工具也会打印无法EXPLAIN解析的告警;
选项
--ask-pass 连接mysql的时候提示输入密码
--charset -A
默认字符集,如果是utf8,则设置Perl的binmode为utf8,设置DBD::mysql为mysql_enable_utf8,且连接mysql后:SET NAMESUTF8
--config
指定配置文件
--create-save-results-database
自动建库--save-results-database如果不存在的话;如果库存在,则不建库;
--[no]create-views
创建视图:--save-results-database
--database –D
指定数据库
--databases
只从逗号分隔的数据库列表中获取表和索引;
--databases-regex
从数据库正则匹配中获取表和index;
--defaults-file
从文件中读取mysql默认选项
--drop
default:non-unique,建议只删除这些类型的未使用索引;
默认只丢弃二级索引,不是主键或者唯一索引;你可以指定建议删除的索引:primary, unique, non-unique, all.
--empty-save-results-tables
删除并创建save-results-database库中的所有表;
--help
帮助选项;
--host
指定主机
--ignore-databases
忽略库
--ignore-databases-regex
忽略正则匹配库
--ignore-tables
忽略表
--ignore-tables-regex
忽略正则匹配表
--password
密码选项
--port
端口选项
--progress
default:time,30
打印进度报告给STDERR,两部分组成,第一部分是百分比,时间或者迭代;第二部分是更新频率-百分比或者秒;
默认是时间,30秒;
--quiet -q
不打印告警信息,禁用--progress
--[no]report
是否打印报告到屏幕;默认打印;
--report-format
default:drop_unused_indexes
--save-results-database
结果会自动保存到指定库中,索引、查询、表的使用信息会被存储到指定的表中,如果表不存在会被自动创建,如果库不存在可以用"--create-save-results-database"自动创建。
pt-index-usage 使用INSERT保存结果集,因此使用的时候要小心,可能会增加负载;
这是新功能,将来可能会改变
运行后,你可以查询使用的表来回答索引使用情况的问题,表的创建如下:
--set-vars
设置mysql变量
--socket
指定连接的socket
--tables
只从指定的表中获取index使用信息
--tables-regex
只从匹配正则表达式的表中获取index信息
--user
指定登陆账户
--version
查看版本
--[no] version-check
查看PerconaToolkit最新版本
标准的自动更新功能,具有两个额外功能:1,它除了检查自己版本外,还检查其他程序的版本,2,检查对已知的问题进行告警,例如MySQL 5.5.25有严重bug,发布了MySQL 5.5.25a