查看MySQL冗余索引和未使用的索引
演示环境mysql5.7.22
查看MySQL冗余索引:
下面的视图sys.schema_redundant_indexes 可以看到MySQL表中的冗余索引
'tidb03' root@localhost 19:31:46 (none)>select * from sys.schema_redundant_indexes limit 1\G
*************************** 1. row ***************************
table_schema: db_bbs #包含重复\冗余索引的表对应的schema的名称
table_name: t_userbaseinfo #包含重复\冗余索引的表名称
redundant_index_name: f_id #包含重复\冗余索引的索引名称
redundant_index_columns: f_id #包含重复\冗余索引的索引列名称
redundant_index_non_unique: 0 #重复\冗余索引中非唯一列的数量
dominant_index_name: PRIMARY #与重复\冗余索引相比占据优势(最佳)索引的名称
dominant_index_columns: f_id #占据优势(最佳)索引的列名称
dominant_index_non_unique: 0 #占据优势(最佳)索引中非唯一列的数量
subpart_exists: 0 # 重复\冗余索引是否是前缀索引
sql_drop_index: ALTER TABLE `db_bbs`.`t_userbaseinfo` DROP INDEX `f_id`
1 row in set (0.17 sec) # 针对重复/冗余索引生成的drop index语句
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
下面是此表的表结构sql:
'tidb03' root@localhost 19:32:36 (none)>show create table `db_bbs`.`t_userbaseinfo`\G
*************************** 1. row ***************************
Table: t_userbaseinfo
Create Table: CREATE TABLE `t_userbaseinfo` (
`f_id` int(4) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`f_nickname` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '昵称 (默认为用户帐号)',
`f_realname` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '真实姓名',
`f_stage_name` varchar(15) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '花名',
`f_password` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '帐号密码',
`f_pay_password` varchar(36) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '支付密码',
`f_head_url` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '头像地址',
`f_country_code` int(5) DEFAULT '86',
`f_phone` varchar(11) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '手机',
`f_reg_ip` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '用户注册IP地址',
`f_signature` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '个性签名',
`f_qq_open_id` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT '',
`f_wechat_open_id` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT '',
`f_weibo_open_id` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT '',
`f_biyong_open_id` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`f_area` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '110000' COMMENT '推荐人userid',
`f_marker` int(1) unsigned zerofill NOT NULL DEFAULT '0' COMMENT '0:正式用户,1:测试用户',
`f_create_time` int(4) NOT NULL COMMENT '注册时间',
`F_modify_time` int(4) NOT NULL COMMENT '更新时间',
`f_status` int(1) NOT NULL DEFAULT '1' COMMENT '数据状态',
`f_block_state` tinyint(1) DEFAULT '0' COMMENT '用户禁言状态',
`f_rank` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`f_position` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`f_dept` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`f_incarnation` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`f_push_token` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '推送token',
`f_os` tinyint(1) unsigned DEFAULT '3',
`f_email` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`f_id`) USING BTREE,
UNIQUE KEY `f_id` (`f_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4979 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC
1 row in set (0.00 sec)
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
查看未使用的索引:
sys.schema_unused_indexes 视图可以查看不活跃的索引(没有任何事件发生的索引,表示该索引从未被使用过),这个必须是MySQL服务运行了好长时间,并且业务代码的相关sql运行了一段时间,这样统计出来的sql才具有一定的参考价值