程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MYSQL入門知識 >> MySQL檢查重復索引工具-pt-duplicate-key-checker

MySQL檢查重復索引工具-pt-duplicate-key-checker

編輯:MYSQL入門知識
 

在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維護管理工具,相當贊,強烈推薦使用。

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved