• 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维护管理工具,相当赞,强烈推荐使用。

    抱怨没有用,只能靠自己
  • 相关阅读:
    Asp.net的HTTP请求处理过程
    通过16道练习学习Linq和Lambda
    学习资料
    .NET处理HTTP请求
    new override virtual 区别与用法
    13个优秀的UML建模工具软件
    做iOS开发程序员10个必需的iOS开发工具和资源[转]
    jQuery的deferred对象详解
    MySQL 5.0存储过程编程入门(转)
    简单谈谈事件与委托(转)
  • 原文地址:https://www.cnblogs.com/mybatis/p/5949324.html
Copyright © 2020-2023  润新知