关于 MySQL 8.0 新特性“隐藏索引”的一点思考
MySQL 8.0有一个称为“隐藏索引”的新功能,它允许快速启用/禁用MySQL Optimizer使用的索引。
在此分享一些对这个新功能的首次使用经验和想法。
对我们有什么用?
一是如果你想删除一个索引,但又想事先知道效果。你就可以使它对优化程序不可见。这是一个快速的元数据更改,使索引不可见。一旦确定没有性能下降,就可以真正去删除索引。
关键的一点是,隐藏索引不能供优化器使用,但它仍然存在,并通过写入操作保持最新。即便我们尝试“FORCE INDEX”,优化器也不会使用它,虽然我认为我们应该能够在某种程度上强制它。可能会有这样的情况:
我们可以创建一个新的隐形索引,但如果想要测试它,必须使它可见。这意味着所有对应用程序有即时影响的查询都将能够使用它。如果目的只是想测试它,我不认为这是最好的方法,不是所有人的服务器上都有相同的数据大小和真实数据。强制隐藏索引这时候可能会很有用。
你有许多索引,但不确定哪一个未使用。你可以将一个索引更改为不可见,以查看是否存在任何性能下降。如果是,你可以立即更改。
你可能有一个特殊情况,只有一个查询可以使用该索引。在这种情况下,隐藏索引可能是一个很好的解决方案。
怎么创建隐藏索引
有两个选项。 我们可以创建一个具有隐藏索引的表,如下所示:
CREATE TABLE `t1` ( `i` int(11) DEFAULT NULL, `j` int(11) DEFAULT NULL, `k` int(11) DEFAULT NULL, KEY `i_idx` (`i`), KEY `idx_1` (`i`,`j`,`k`) INVISIBLE ) ENGINE=InnoDB DEFAULT CHARSET=latin1
或者我们可以使用alter table并将索引更改为隐藏:
ALTER TABLE t1 ALTER INDEX idx_1 INVISIBLE;
怎么使用隐藏索引
如果我们现在要删除索引,我们可以将其更改为隐藏。 但是使用“FORCE / USE INDEX”的查询怎么样? 他们是否会抛出一个错误? 如果强制不存在的索引,你会收到错误。 你不会看到隐藏索引的错误。 优化器不会使用它,但知道它存在。
show create table t1 G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`i` int(11) DEFAULT NULL,
`j` int(11) DEFAULT NULL,
`k` int(11) DEFAULT NULL,
KEY `i_idx` (`i`),
KEY `idx_1` (`i`,`j`,`k`)
) ENGINE=InnoDB DEFAULT CHARSET=latin11 row in set (0.00 sec)
mysql> explain select * from t1 force index(idx_1) where i=1 and j=4;
+----+-------------+-------+------------+------+---------------+-------+---------+-------------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+-------+---------+-------------+------+----------+-------------+
| 1 | SIMPLE | t1 | NULL | ref | idx_1 | idx_1 | 10 | const,const | 2 | 100.00 | Using index |
+----+-------------+-------+------------+------+---------------+-------+---------+-------------+------+----------+-------------+1 row in set, 1 warning (0.00 sec)
mysql> alter table t1 alter index idx_1 invisible;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0mysql> explain select * from t1 force index(idx_1) where i=1 and j=4;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| 1 | SIMPLE | t1 | NULL | ALL | NULL | NULL | NULL | NULL | 16 | 6.25 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+1 row in set, 1 warning (0.01 sec)
mysql> explain select * from t1 where i=1 and j=4;
+----+-------------+-------+------------+------+---------------+-------+---------+-------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+-------+---------+-------+------+----------+-------------+
| 1 | SIMPLE | t1 | NULL | ref | i_idx | i_idx | 5 | const | 2 | 10.00 | Using where |
+----+-------------+-------+------------+------+---------------+-------+---------+-------+------+----------+-------------+1 row in set, 1 warning (0.00 sec)
正如你所看到的,如果我们使用带有隐藏索引的“FORCE INDEX”,MySQL会执行全表扫描。 MySQL不会抛出任何错误,因为索引存在,但它不可见。 即使有另一个可用的索引,它也将执行全表扫描。 在大型表上,这可能会导致严重的性能问题。 即使MySQL在查询执行期间不抛出任何错误,它也应该会在错误日志中记录一个警告。
结论
我认为隐形索引是一个伟大的新功能,可以对许多人有用。 如果有需要,可以尝试着去使用,并且尝试记录试图使用隐藏索引的查询,说不定会得到一些惊喜。
英文原文:Thoughts on MySQL 8.0's Invisible Indexes
文章转载自 开源中国社区 [http://www.oschina.net]
转载于:https://blog.51cto.com/andylhz2009/1868800
关于 MySQL 8.0 新特性“隐藏索引”的一点思考相关推荐
- MySQL 8.0新特性--CTE Recurive(二)
上一篇介绍了CTE的基本用法,参考MySQL 8.0新特性--CTE(一),本篇再来介绍一下CTE Recurive递归. 1.什么是CTE Recurive? A recursive common ...
- mysql8.0创建属性,MySQL 8.0新特性 — 管理端口的使用简介
前言 下面这个报错,相信大多数童鞋都遇见过:那么碰到这个问题,我们应该怎么办呢?在MySQL 5.7及之前版本,出现"too many connection"报错,超级用户root ...
- mysql3819错误,MySQL 8.0新特性 ― 检查性约束的使用简介
前言 在MySQL 8.0版本中,引入了一个非常有用的新特性 ― 检查性约束,它可以提高对非法或不合理数据写入的控制能力:接下来我们就来详细了解一下. 检查性约束 创建.删除与查看 (1)可以在建表时 ...
- MySql 8.0新特性:窗口函数
MySQL8.0新特性:窗口函数 1.1 使用窗口函数前后对比 假设我现在有这样一个数据表,它显示了某购物网站在每个城市每个区的销售额: CREATE TABLE sales( id INT PRIM ...
- MySQL 8.0 新特性之隐藏字段
文章目录 基本概念 隐藏字段与 DDL 语句 隐藏字段与 DML 语句 隐藏字段相关的元数据 隐藏字段与二进制日志 大家好,我是只谈技术不剪发的 Tony 老师. MySQL 8.0.23 版本增加了 ...
- mysql+8.0+新特性_MySQL 8.0备受瞩目的新特性大放送!
原标题:MySQL 8.0备受瞩目的新特性大放送! 作者介绍 杨奇龙,目前就职于有赞科技,负责数据库运维工作,熟悉MySQL性能优化.故障诊断.性能压测. MySQL于 2016-09-12正式发布8 ...
- MySQL 8.0 新特性:引人注目的哈希连接(Hash Join)
点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 来源:r6d.cn/uATq MySQL 开发组于 2019 年 10 月 ...
- sql server的密码采用自带什么密码技术存储_【技术分享】浅谈MYSQL 8.0新特性
于树文 云技术管理处 01 MySQL 8.0中添加的功能 1. 新的系统字典表 整合了存储有关数据库对象信息的事务数据字典,所有的元数据都用InnoDB引擎进行存储. 2. 支持DDL 原子操作 I ...
- mysql 6.0 新特性 2014_MySQL 各版本的特性
Mysql5.5 特性,相对于Mysql5.1 性能提升 默认存储引擎更改为 InnoDB引擎.具有提交.回滚和宕机恢复功能 和ACID兼容. 行级锁. 表与索引存储在表空间中, 表大小无限制. 支持 ...
最新文章
- python get方法请求参数_python中requests库get方法带参数请求
- 中国移动开发者社区专访:学习Android的两大法宝
- 【Android基础】从属性动画看代码设计的艺术
- android系统下替换so库等操作
- redis通过key模糊搜索_Redis—熬了一个通宵,终于把Key删完了!
- 数学--数论--HDU1222 狼和兔子(最大公约数)
- mysql 关于binlog的一些命令
- IOCP 下行为投递的关键点
- C# 获取硬盘序列号
- 规范使用地图,从规范制图开始
- MySQL创建商品入库和出库后库存更新的触发器
- 超实用超全 || ZBrush笔刷大合集
- week15——作业(字符串,完结撒花)
- 一文了解LD7537RGL
- Python爬虫——Scrapy框架的基本使用
- 支付公司如何赚钱?支付网关如何设计?
- Nexus 6p 刷入TWRP和OPENGAPPS
- 山寨电子以改良式研发谋求蜕变
- su - xxx Could not create session 无法su切换用户
- 2021最火表情包壁纸小程序,全自动一键采集,对接外卖cps,独立后台,无需授权。
热门文章
- Select()和SelectMany()的区别
- C#生成不重复随机数列表
- 和菜鸟一起学android4.0.3源码之lcd屏幕背光调节
- java 获取本机mac地址并转为字符串
- container of()函数简介
- OPENSSH升级为7.4
- OpenCV3 install tutorial for Mac
- Hadoop核心之MapReduce架构设计
- WCF调试异常信息:找不到类型“”,在 ServiceHost 指令中提供为 Service 特性值,或在配置元素 system.serviceModel/serviceHosting...
- php截取字符串,无乱码