MySQL检查重复索引工具-pt-duplicate-key-checker


在MySQL中是允许在同一个列上创建多个索引的,示例如下:

mysql --socket=/tmp/mysql5173.sock -uroot -p
mysql> SELECT VERSION(); +-----------+ | VERSION() | +-----------+ | 5.1.73 | +-----------+ 1 row in set (0.00 sec) # 创建测试表 mysql> DROP TABLE temp; ERROR 1051 (42S02): Unknown table 'temp' mysql> CREATE TABLE temp  -> (id int auto_increment primary key,  -> name varchar(20),  -> password varchar(20),  -> age int) ENGINE=INNODB DEFAULT CHARSET=utf8; Query OK, 0 rows affected (0.12 sec) # 插入测试数据 mysql> INSERT INTO temp(name, password, age) \ VALUES('robin', '123456', '18'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO temp(name, password, age) \ VALUES('jack', '123456', '19'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO temp(name, password, age) \ VALUES('rose', '123456', '20'); Query OK, 1 row affected (0.00 sec) mysql> SELECT * FROM temp; +----+-------+----------+------+ | id | name | password | age | +----+-------+----------+------+ | 1 | robin | 123456 | 18 | | 2 | jack | 123456 | 19 | | 3 | rose | 123456 | 20 | +----+-------+----------+------+ 3 rows in set (0.00 sec)

接着在name列上创建两个相同的索引。

mysql> CREATE INDEX idx_test_temp_name ON test.temp(name); Query OK, 3 rows affected (0.07 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> CREATE INDEX idx_test_temp_name_new ON test.temp(name); Query OK, 3 rows affected (0.11 sec) Records: 3 Duplicates: 0 Warnings: 0

我们使用 pt-duplicate-key-checker 工具检查是否有重复的索引。根据结果,我们可以看出重复的索引信息,包括索引定义,列的数据类型,以及修复建议。

pt-duplicate-key-checker --user=root \ --password=xxxx \ --host=localhost \ --socket=/tmp/mysql5173.sock

输出结果。

# ######################################################################## # test.temp # ######################################################################## # idx_test_temp_name is a duplicate of idx_test_temp_name_new # Key definitions: # KEY `idx_test_temp_name` (`name`), # KEY `idx_test_temp_name_new` (`name`) # Column types: # `name` varchar(20) default null # To remove this duplicate index, execute: ALTER TABLE `test`.`temp` DROP INDEX `idx_test_temp_name`; # ######################################################################## # Summary of indexes # ######################################################################## # Size Duplicate Indexes 189 # Total Duplicate Indexes 1 # Total Indexes 32

我们根据修复建议,删除重复的索引。

mysql> ALTER TABLE `test`.`temp` DROP INDEX `idx_test_temp_name`; Query OK, 3 rows affected (0.13 sec) Records: 3 Duplicates: 0 Warnings: 0

再次使用 pt-duplicate-key-checker 工具检查是否有重复的索引。根据输出结果,可以看出已经没有重复的索引了。

pt-duplicate-key-checker --user=root \ --password=xxxx \ --host=localhost \ --socket=/tmp/mysql5173.sock
# ######################################################################## # Summary of indexes # ######################################################################## # Total Indexes 31

总结

重复的索引必定会浪费系统资源,势必找出重复索引,然后干掉它。 pt-duplicate-key-checker 工具是Percona Toolkit中的一员,是DBA进行维护的好帮手。顺便说下,Percona Toolkit 是一组相当赞的MySQL维护管理工具,相当赞,强烈推荐使用。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM