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