mysql8.0新特性--隐藏索引
时间:2022-07-25
本文章向大家介绍mysql8.0新特性--隐藏索引,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
我们有时候想删除掉冗余索引,但是又怕删除之后影响到查询性能,这时候再回退就需要一定的时间。MySQL8.0开始支持隐藏索引(invisible indexes),隐藏索引不会被优化器使用,如果你想验证某个索引删除之后的查询性能影响,就可以暂时先隐藏该索引。但是有一点主键不能被设置为隐藏索引,当表中没有显式主键时,表中第一个唯一非空索引会成为隐式主键,也不能设置为隐藏索引。
索引默认是可见的,在使用CREATE TABLE,,CREATE INDEX或者ALTER TABLE等语句时可以通过VISIBLE或者INVISIBLE关键词设置索引的可见性。
创建新表时指定隐藏索引
CREATE TABLE `student` (
`id` int NOT NULL AUTO_INCREMENT,
`id_card` int NOT NULL,
`name` varchar(10) NOT NULL,
`age` int NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_id_card` (`id_card`) /*!80000 INVISIBLE */
) ENGINE=InnoDB
我导入了4万条数据,通过以下执行计划可以看到,优化器并没有使用索引,而是使用的全表扫描。
mysql> explain select * from student where id_card=100;
+----+-------------+---------+------------+------+---------------+------+---------+------+-------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+---------+------------+------+---------------+------+---------+------+-------+----------+-------------+
| 1 | SIMPLE | student | NULL | ALL | NULL | NULL | NULL | NULL | 39231 | 0.00 | Using where |
+----+-------------+---------+------------+------+---------------+------+---------+------+-------+----------+-------------+
1 row in set, 1 warning (0.00 sec)
alter修改隐藏索引为可见。
alter table student alter index idx_id_card visible;
再次查看执行计划,这次优化器选择了idx_id_card索引。
mysql> explain select * from student where id_card=100;
+----+-------------+---------+------------+------+---------------+-------------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+---------+------------+------+---------------+-------------+---------+-------+------+----------+-------+
| 1 | SIMPLE | student | NULL | ref | idx_id_card | idx_id_card | 4 | const | 4 | 100.00 | NULL |
+----+-------------+---------+------------+------+---------------+-------------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)
alter修改普通索引为隐藏索引。
alter table student alter index idx_id_card invisible;
查询某个表中的索引是否为隐藏索引
mysql> SELECT INDEX_NAME, IS_VISIBLE FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'student';
+-------------+------------+
| INDEX_NAME | IS_VISIBLE |
+-------------+------------+
| idx_id_card | NO |
| PRIMARY | YES |
+-------------+------------+
2 rows in set (0.00 sec)
系统变量optimizer_switch中的use_invisible_indexes控制了优化器在构建执行计划时是否使用隐藏索引,如果设置为off(默认)优化器会忽略隐藏索引。如果设置为on,即使隐藏索引不可见,优化器在生成执行计划时仍会考虑使用隐藏索引。
参考了MySQL官方文档《refman-8.0-en.a4》。
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- 实在是妙啊!Java中强软虚弱引用,居然还能这样去操作
- 数据库连接池引起的FullGC问题,看我如何一步步排查、分析、解决
- Swift 数组dropFirst方法
- Swift 类方法和实例方法
- 我从未见过的牛逼解说方式!Redis五种数据结构,看一遍就懂了
- Swift 动态创建ViewController
- Office 文档解析 文档格式和协议
- 查看centos 7里敏感信息的常用命令(未完)
- C# dotnet 使用 FileStream 随机文件读写
- datables之加载数据时显示进度条
- 这几种常见的“分布式锁”写法,搞懂再也不怕面试官,安排
- C# 8.0 文件长度 Bytes 字节转 KB 等单位字符串
- LeetCode---两数之和
- 通过 cmd 批处理文件将 16 进制转 10 进制数字
- HTML5-JS操作页面滚动条(禁止、隐藏、显示、不显示)