MySQL中重复索引和重复外键清理

MySQL允许在相同列上创建重复的索引,但这样做对数据库却是有害而无利的,需要定期检查此类重复索引以改善数据库性能。

可减少磁盘空间占用、减少磁盘IO、减少优化器优化查询时需要比较的索引个数、减少数据库维护冗余索引的各类开销、提高数据库性能(插入、更新、删除)

重复索引检测
pt-duplicate-key-checker:通过SHOW CREATE TABLE输出的表定义检测MySQL表中重复或者冗余的索引或外键

可以检测到的冗余/重复索引类型:若某个索引和另外某个索引以同样的顺序包含同样的列,或者该索引包含的列是另外某个索引的最左前缀列,则被认为是重复/冗余的索引。默认情况下只在同类型的索引间(如BTREE索引)进行比较,不同类型的索引即使符合上述描述也不会被认为是重复/冗余,但这一行为可以通过参数改变。除此之外,还可检测重复的外键,即引用的表和列均相同的外键。对于聚簇索引的表,在辅助索引后添加主键列的索引也被认为是冗余的,因为这种情况下,辅助索引末尾本身就包含有主键信息。

首先看我的这张表的索引结构
     mysql> show indexes from curs;
    

  1. +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+  
  2. Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |  
  3. +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+  
  4. | curs  |          0 | PRIMARY  |            1 | id          | A         |           1 |     NULL | NULL   |      | BTREE      |         |               |  
  5. | curs  |          1 | name     |            1 | name        | A         |           1 |     NULL | NULL   |      | BTREE      |         |               |  
  6. | curs  |          1 | age      |            1 | age         | A         |           1 |     NULL | NULL   |      | BTREE      |         |               |  
  7. | curs  |          1 | name_age |            1 | name        | A         |           1 |     NULL | NULL   |      | BTREE      |         |               |  
  8. | curs  |          1 | name_age |            2 | age         | A         |           1 |     NULL | NULL   |      | BTREE      |         |               |  
  9. | curs  |          1 | age_name |            1 | age         | A         |           1 |     NULL | NULL   |      | BTREE      |         |               |  
  10. | curs  |          1 | age_name |            2 | name        | A         |           1 |     NULL | NULL   |      | BTREE      |         |               |  
  11. | curs  |          1 | name_1   |            1 | name        | A         |           1 |     NULL | NULL   |      | BTREE      |         |               |  
  12. | curs  |          1 | age_1    |            1 | age         | A         |           1 |     NULL | NULL   |      | BTREE      |         |               |  
  13. +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+  

     里面有大量的重复索引,比如name与name_age重复,也与name_1重复,这3个索引都是相同的索引。下面看下怎么使用/usr/local/bin/pt-duplicate-key-checker来检查重复的索引。
    
    [root@localhost ~]# /usr/local/bin/pt-duplicate-key-checker  --host=192.168.1.106 --user='mysql' --password='123456'  --databases=test --tables=curs
  1. # ########################################################################  
  2. # test.curs                                                                 
  3. # ########################################################################  
  4.   
  5. name is a left-prefix of name_age  
  6. Key definitions:  
  7. #   KEY `name` (`name`),  
  8. #   KEY `name_age` (`name`,`age`),  
  9. Column types:  
  10. #         `namevarchar(100) not null default ''  
  11. #         `age` smallint(3) unsigned not null default '0'  
  12. To remove this duplicate indexexecute:  
  13. ALTER TABLE `test`.`curs` DROP INDEX `name`;  
  14.   
  15. # name_1 is a left-prefix of name_age  
  16. Key definitions:  
  17. #   KEY `name_1` (`name`),  
  18. #   KEY `name_age` (`name`,`age`),  
  19. Column types:  
  20. #         `namevarchar(100) not null default ''  
  21. #         `age` smallint(3) unsigned not null default '0'  
  22. To remove this duplicate indexexecute:  
  23. ALTER TABLE `test`.`curs` DROP INDEX `name_1`;  
  24.   
  25. # age is a left-prefix of age_name  
  26. Key definitions:  
  27. #   KEY `age` (`age`),  
  28. #   KEY `age_name` (`age`,`name`),  
  29. Column types:  
  30. #         `age` smallint(3) unsigned not null default '0'  
  31. #         `namevarchar(100) not null default ''  
  32. To remove this duplicate indexexecute:  
  33. ALTER TABLE `test`.`curs` DROP INDEX `age`;  
  34.   
  35. # age_1 is a left-prefix of age_name  
  36. Key definitions:  
  37. #   KEY `age_1` (`age`)  
  38. #   KEY `age_name` (`age`,`name`),  
  39. Column types:  
  40. #         `age` smallint(3) unsigned not null default '0'  
  41. #         `namevarchar(100) not null default ''  
  42. To remove this duplicate indexexecute:  
  43. ALTER TABLE `test`.`curs` DROP INDEX `age_1`;  
  44.   
  45. # ########################################################################  
  46. # Summary of indexes                                                        
  47. # ########################################################################  
  48.   
  49. Size Duplicate Indexes   608  
  50. # Total Duplicate Indexes  4  
  51. # Total Indexes            7 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值