原文链接:https://www.modb.pro/db/22619

导读:本文详细介绍 MySQL 8.0.19 三大索引新功能,隐藏索引,降序索引,函数索引,结合其他同仁的技术应用案例,进一步进行验证改编,最后总结心得,希望对大家有帮助。

MySQL 8.0 版本带来了3大索引新功能:隐藏索引,降序索引,函数索引,看字面意义,大致也都能猜到那些功能,下面测试实际了解一下。

隐藏索引


MySQL 8.0 支持隐藏索引(invisible index),也称为不可见索引。隐藏索引不会被优化器使用。主键不能设置为隐藏(包括显式设置或隐式设置)

CREATE TABLE `tb_index` (  `id` bigint NOT NULL ,  `name` varchar(255) DEFAULT NULL,  `age` tinyint DEFAULT '10',  `create_time` datetime DEFAULT NULL,  `update_time` datetime DEFAULT NULL,  `addr` varchar(30) DEFAULT NULL,  `sex` enum('M','F') DEFAULT NULL,  PRIMARY KEY(id),  UNIQUE uni_age (age),  INDEX idx_addr (addr) ,  INDEX idx_sex (sex) INVISIBLE,  FULLTEXT KEY `fullindex_name` (`name`)) ;

##两种方式验证

mysql>SHOW INDEX FROM `tb_index`;mysql>SELECT INDEX_NAME, IS_VISIBLE FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = 'db1' AND TABLE_NAME = 'tb_index'

##隐藏和可见操作

除了主键,其他索引都可以。

对于唯一建:例外情况: 没有主键的情况下,第一个唯一建 不可隐藏,第二个唯一建可隐藏。
从这里可以了解到 MySQL在没有主键的情况下 是把第一个唯一建做为主键。

CREATE TABLE `tb_index2` (  `id` bigint NOT NULL ,  `name` varchar(255)  NOT NULL,  `age` tinyint DEFAULT '10' NOT NULL ,  `create_time` datetime  NOT NULL,  `update_time` datetime  NOT NULL,  `addr` varchar(30)  NOT NULL,  `sex` enum('M','F')  NOT NULL,  UNIQUE uni_age (age),  UNIQUE uni_id(id),  INDEX idx_addr (addr) ,  INDEX idx_sex (sex) INVISIBLE,  FULLTEXT KEY `fullindex_name` (`name`)) ;##隐藏和可见操作```sqlmysql>ALTER TABLE tb_index ALTER INDEX uni_age INVISIBLE;mysql>ALTER TABLE tb_index ALTER INDEX uni_age VISIBLE;
mysql>ALTER TABLE tb_index ALTER INDEX uni_id INVISIBLE;mysql>ALTER TABLE tb_index ALTER INDEX uni_id VISIBLE;

执行计划:
系统变量 optimizer_switch 的 use_invisible_indexes 值控制了优化器构建执行计划时是否使用隐藏索引。如果设置为 off (默认值),优化器将会忽略隐藏索引(与引入该属性之前的行为相同)。如果设置为 on,隐藏索引仍然不可见,但是优化器在构建执行计划时将会考虑这些索引。

mysql> SHOW VARIABLES LIKE '%optimizer_switch%';

##当name索引隐藏的时候

mysql>ALTER TABLE tb_index ALTER INDEX idx_name INVISIBLE;

#当name索引显示的时候

mysql>ALTER TABLE tb_index ALTER INDEX idx_name VISIBLE;

#optimizer_switch进行控制

mysql>ALTER TABLE tb_index ALTER INDEX idx_name INVISIBLE;mysql>set optimizer_switch='use_invisible_indexes=on';
mysql> explain select * from tb_index where age =12 and name ='9961139@qq.com';

好的方面的optimizer_switch=‘use_invisible_indexes=on’ session级别,特定的时间可以通过参数进行使用。

总结:

不可见索引特性可以用于测试删除某个索引对于查询性能的影响,同时又不需要真正删除索引,也就避免了错误删除之后的索引重建。对于一个大表上的索引进行删除重建将会非常耗时,而将其设置为不可见或可见将会非常简单快捷。

如果某个设置为隐藏的索引实际上仍然需要或者被优化器所使用,可以通过以下多种方法发现缺少该索引带来的影响:

  • 索引提示中使用了该索引的查询将会产生错误;
  • 性能模式(Performance Schema)中的数据显示受影响查询的负载升高;
  • EXPLAIN 语句显示了不同的查询执行计划;
  • 慢查询日志中出现了新的查询语句。

需要思考的问题:

增删改操作,本身会进行索引的维护,隐藏索引是否有必要创建。

降序索引


MySQL8.0开始真正支持降序索引,只有InnoDB引擎支持降序索引,且必须是BTREE降序索引,MySQL8.0不在对group by操作进行隐式排序。

查看官方:

MySQL支持降序索引:索引定义中的DESC不再被忽略,而是按降序存储键值。以前,可以以相反的顺序扫描索引,但是会导致性能损失。下行索引可以按前向顺序扫描,效率更高。当最有效的扫描顺序混合了某些列的升序和其他列的降序时,降序索引也使优化器能够使用多列索引。

注意:

  • Ddescending索引只支持InnoDB存储引擎
  • 具有降序关键部分的索引不用于对调用聚合函数但没有GROUP BY子句的查询进行MIN()/MAX()优化
  • 降序索引:BTREE支持,但不支持哈希索引,全文索引或空间索引
  • DISTINCT可以使用包含匹配列(包括降序关键部分)的任何索引。
  • 对于所有可用升序索引的数据类型,都支持降序索引。

语法如下,用法简单,需要考虑索引维护的成本和实际使用场景。对于MAX,MIN,DISTINCT 降序索引进行优化。

CREATE TABLE t (  c1 INT, c2 INT,  INDEX idx1 (c1 ASC, c2 ASC),  INDEX idx2 (c1 ASC, c2 DESC),  INDEX idx3 (c1 DESC, c2 ASC),  INDEX idx4 (c1 DESC, c2 DESC));

函数索引


MySQL版本需要是5.7及以上版本才支持建立函数索引(虚拟列方式),MySQL 8.0.13 以及更高版本支持函数索引(functionalkey parts),也就是将表达式的值作为索引的内容,而不是列值或列值前缀。将函数作为索引键可以用于索引那些没有在表中直接存储的内容。

##引用上面的表tb_index

mysql>ALTER TABLE tb_index  ADD INDEX idx_created (create_time);Mysql>EXPLAIN SELECT id ,name ,age ,create_time,update_time ,month(create_time)FROM tb_indexWHERE  month(create_time) =8
mysql>ALTER TABLE tb_index  ADD INDEX idx_created_fun((month(create_time)));
  • 函数索引支持UNIQUE选项。但是,主键不能包含函数列。主键只能使用存储的计算列,但是函数索引使用虚拟计算列实现,而不是存储计算列。
  • 空间SPATIAL 索引和 全文FULLTEXT 索引不支持函数索引。
  • 如果某个表中没有主键,InnoDB 存储引擎自动将第一个 UNIQUE NOT NULL 索引提升为主键。但是对于包含函数列的 UNIQUE NOT NULL 索引不会进行提升。
  • 如果要删除的字段上有函数索引,必须先删除函数索引,才能删除字段。

总结:


以上介绍内容虽然给带来了多样性的功能,但怎样更有效的使用,才是问题关键。特别是隐藏索引,多一个索引就是多出一份维护成本。

墨天轮原文链接:https://www.modb.pro/db/22619(复制到浏览器中打开或者点击“阅读原文”)

groupby索引有效吗_两千字揭密 MySQL 8.0.19 三大索引新功能相关推荐

  1. 两千字揭密 MySQL 8.0.19 三大索引新功能:隐藏索引,降序索引,函数索引

    导读:本文详细介绍 MySQL 8.0.19 三大索引新功能,隐藏索引,降序索引,函数索引,结合其他同仁的技术应用案例,进一步进行验证改编,最后总结心得,希望对大家有帮助. MySQL 8.0 版本带 ...

  2. mysql8.0源代码解析_源码解读:MySQL 8.0 InnoDB无锁化设计的日志系统

    原标题:源码解读:MySQL 8.0 InnoDB无锁化设计的日志系统 作者介绍 张永翔,现任网易云RDS开发,持续关注MySQL及数据库运维领域,擅长MySQL运维,知乎ID:雁南归. MySQL ...

  3. mysql8不区分大小写_技术译文 | MySQL 8.0.19 GA!

    作者:Geir Hoydalsvik 原文:https://mysqlserverteam.com/the-mysql-8-0-19-maintenance-release-is-generally- ...

  4. 电脑显示器变色_两千元档超强电竞小金刚:180hz的泰坦军团T27QR显示器

    前言 泰坦军团(TitanArmy),作为一款追求性价比的国产品牌,近年来在电竞显示器领域开始崭露头角,本文评测的产品:泰坦军团T27QR,正是这样一款具有代表性的产品.IPS面板,2k分辨率,180 ...

  5. MySQL PK,FK,视图,索引,引擎总结【12000字概览MySQL】用于查漏补缺

    Java养成计划----学习打卡第七十四,五,六天 内容导航 主键的注意要点 外键约束 foreign key FK 父子的顺序 外键约束的创建格式 存储引擎 SHOW ENGINES\G 常用引擎 ...

  6. datetime建立索引有用吗_超全的数据库建表、SQL、索引规范

    背景 因为工作岗位的原因,负责制定了关于后端组数据库的规约规范,作为所有产品线的规范,历经几版的修改,最终形成下边的文本,规范在整个后端执行也有大半年的时间,对于整个团队在开发阶段就减少不恰当的建表语 ...

  7. mysql 创建表格time类型_记一次关于 Mysql 中 text 类型和索引问题引起的慢查询的定位及优化...

    最近有用户反馈产品有些页面加载比较慢,刚好我在学习 Mysql 相关知识,所以先从 Mysql 慢查询日志开始定位: step1:通过慢查询日志定位具体 SQL 首先通过 SHOW VARIABLES ...

  8. solr mysql 增量索引_基于Solr DIH实现MySQL表数据全量索引和增量索引

    实现MySQL表数据全量索引和增量索引,基于Solr DIH组件实现起来比较简单,只需要重复使用Solr的DIH(Data Import Handler)组件,对data-config.xml进行简单 ...

  9. 一万六千字的MySQL数据库操作详细教学,看完别说你不会

    1.做测试为什么需要学习数据库? (1)只有会数据库操作,才能更全面准确的开展功能测试: (2)测试环境搭建:web系统里有数据库,你就必须会数据库,从而搭建好环境,开展测试: (3)为性能测试做准备 ...

最新文章

  1. mybatis学习4之使用注解开发实现简单的增删改查
  2. dva处理_umi项目中dvaeffects异常统一处理
  3. 关于定义视频播放器的界面的相关的类transPortcontroll等
  4. 使用RNN解决句子对匹配问题的常见网络结构
  5. Enumerable#zip特性
  6. 最近发现系统rabbitmq丢消息比较严重,于是想了些方案来查找原因,给将消息发送方式添加确认机制。 我们在本地模拟了wms发送打标消息的场景. 1. 有事务 2. 先发点对点队列, 再发订
  7. SqlSessionTemplate是如何保证MyBatis中SqlSession的线程安全的?
  8. devops 开发_DevOps如何消除开发瓶颈
  9. Intent.ACTION_PICK
  10. 小米12 mini曝光:骁龙898加持
  11. redis的info
  12. 如何判断等保测评机构有资质?符合要求?
  13. 百度贴吧恶意代码分析
  14. CF1428F-Fruit Sequences
  15. 网站seo优化3-7天快速上百度首页靠谱吗?怎么做
  16. Android开源项目以及开源库集合(持续更新中)
  17. OO,OO以后,及其极限
  18. 【算力网络】算力网络的发展趋势
  19. 用html制作表白网站制作 超炫酷的七夕情人节表白网页代码
  20. 华硕hd7850_参测产品之华硕Dragon HD7850 2G_华硕 龙骑士DRAGON HD7850-DC2O-2GD5 _显卡评测-中关村在线...

热门文章

  1. 制作自己的特色PE----Mr.Zhang
  2. java 调度框架_java调度框架Quartz(一)
  3. cad页面布局快捷键_炸裂“图纸集”功能、高手都在偷偷用的CAD图纸管理神器
  4. IFIX和Historian历史数据曲线图
  5. python读取yaml文件
  6. 解决报错OMP: Error #15: Initializing libiomp5.dylib, but found libomp.dylib already initialized
  7. 解决安装MarkupSafe安装 from setuptools import Feature 报错ImportError: cannot import name ‘Feature‘
  8. Python 简写操作(for、if简写、匿名函数)
  9. python 字节码操作_从操作码和参数列表创建Python字节码?
  10. 工厂员工晋升机制_维修厂如何设置员工晋升机制?