c语言 字符串 正序再倒序_新特性解读 | MySQL 8.0 索引特性3 -倒序索引
原创作者:杨涛涛
我们今天来介绍下 MySQL 8.0 引入的新特性:倒序索引。
MySQL长期以来对索引的建立只允许正向asc存储,就算建立了desc,也是忽略掉。
比如对于以下的查询,无法发挥索引的最佳性能。
- 查询一:
select * from tb1 where f1 = ... order by id desc;
- 查询二:
select * from tb1 where f1 = ... order by f1 asc , f2 desc;
那对于上面的查询,尤其是数据量和并发到一定峰值的时候,则对OS的资源消耗非常大。一般这样的SQL在查询计划里面会出现using filesort等状态。
比如针对下面的表t1,针对字段rank1有两个索引,一个是正序的,一个是反序的。不过在MySQL 8.0 之前的版本都是按照正序来存储。
按照rank1 正向排序的执行计划,
按照rank1 反向排序的执行计划,
从执行计划来看,反向比正向除了extra里多了Using temporary; Using filesort这两个,其他的一模一样。这两个就代表中间用到了临时表和排序,一般来说,凡是执行计划里用到了这两个的,性能几乎都不咋地。除非我这个临时表不太大,而用于排序的buffer也足够大,那性能也不至于太差。那这两个选项到底对性能有多大影响呢?
我们分别执行这两个查询,并且查看MySQL的session级的status就大概能看出些许不同。
通过以上两张图,我们发现反向的比正向的多了很多个计数,比如通过扫描的记录数增加了10倍,而且还伴有10倍的临时表的读和写记录数。那这个开销是非常巨大的。那以上的查询是在MySQL 5.7 上运行的。
MySQL 8.0 给我们带来了倒序索引(Descending Indexes),也就是说反向存储的索引。 这里不要跟搜索引擎中的倒排索引混淆了,MySQL这里只是反向排序存储而已。不过这个倒序存储已经解决了很大的问题。我们再看下之前在MySQL 5.7 上运行的例子。
我们把数据导入到MySQL 8.0,
再把原来的索引变为倒序索引,
再次看下第二个SQL的查询计划,
很显然,用到了这个倒序索引 idx_rank1_desc,而这里的临时表等的信息消失了。
当然了,这里的组合比较多,比如我这张表的字段rank1,rank2两个可以任意组合。
组合一:
(rank1 asc,rank2 asc);
- 组合二:
(rank1 desc,rank2 desc);
- 组合三:
(rank1 asc,rank2 desc);
- 组合四:
(rank1 desc,rank2 asc);
我把这几个加上,适合的查询比如:
- 查询一:
Select * from t1 where rank1 = 11 order by rank2;
- 查询二:
Select * from t1 where 1 order by rank1,rank2;
- 查询三:
Select * from t1 where 1 order by rank1 desc,rank2;
等等,这里就不一一示范了。
历期文章回顾
爱可生云数据库:新特性解读 | MySQL 8.0 新增 HINT 模式
爱可生云数据库:新特性解读 | MySQL 8.0 索引特性2-索引跳跃扫描
爱可生云数据库:新特性解读 | MySQL 8.0 索引特性1-函数索引
爱可生云数据库:新特性解读 | MySQL 8.0 通用表达式
c语言 字符串 正序再倒序_新特性解读 | MySQL 8.0 索引特性3 -倒序索引相关推荐
- c语言 字符串 正序再倒序_python字符串
索引:通过下标来获取元素,从零开始 从左到右为正序,从零开始 从右往左为倒序,最右边为-1,倒数第二为-2,...... str="python" print(str[1]) # ...
- c语言 字符串 正序再倒序_MySQL - 字符串索引优化
字符串建立索引的优化 1. 建立前缀索引 假设建立一个支持邮箱登录的用户表,对于邮件字段来说,可以有以下几种建立索引的方式: 直接对整个字符串建立索引 alter table SUser add in ...
- 中累计直方图_新特性解读 | MySQL 8.0 直方图
原创作者:杨涛涛 MySQL 8.0 推出了histogram,也叫柱状图或者直方图.先来解释下什么叫直方图. 关于直方图 我们知道,在DB中,优化器负责将SQL转换为很多个不同的执行计划,完了从中选 ...
- c语言字符串正序反序连接输出,C语言中字符串实现正序与逆序实例详解
C语言中字符串实现逆序实例详解 字符串逆序和正序的实现代码: #include #include #include #include #include /*定义*/ typedef struct no ...
- mysql 8函数索引_新特性解读 | MySQL 8.0 索引特性1-函数索引
原创作者:杨涛涛 函数索引顾名思义就是加给字段加了函数的索引,这里的函数也可以是表达式.所以也叫表达式索引. MySQL 5.7 推出了虚拟列的功能,MySQL8.0的函数索引内部其实也是依据虚拟列来 ...
- concat 不是可以识别的 内置函数名称。_新特性解读 | MySQL 8.0 窗口函数详解
背景 一直以来,MySQL 只有针对聚合函数的汇总类功能,比如MAX, AVG 等,没有从 SQL 层针对聚合类每组展开处理的功能.不过 MySQL 开放了 UDF 接口,可以用 C 来自己写UDF, ...
- 端口如何支持非localhost访问_新特性解读 | MySQL 8.0.19 支持 DNS SRV
转载自公众号:玩转MySQL 作者:洪斌 MySQL Router 是 InnoDB Cluster 架构的访问入口,在架构部署上,官方给出的建议是 router 与应用端绑定部署,避免 router ...
- mysql8导入 psc 没有数据_新特性解读 | MySQL 8.0.22 任意格式数据导入
作者:杨涛涛 资深数据库专家,专研 MySQL 十余年.擅长 MySQL.PostgreSQL.MongoDB 等开源数据库相关的备份恢复.SQL 调优.监控运维.高可用架构设计等.目前任职于爱可生, ...
- mysql force index报错_新特性解读 | MySQL 8.0 索引特性4-不可见索引
MySQL 8.0 实现了索引的隐藏属性.当然这个特性很多商业数据库早就有了,比如ORACLE,在11g中就实现了.我来介绍下这个小特性. 介绍 INVISIBLE INDEX,不可见索引或者叫隐藏索 ...
最新文章
- python面试常见问题-Python面试常见的8个问题及答案总结
- TP5 实现转盘抽奖
- 在Windows XP里,设置USB只读
- [JSOI2008]星球大战
- lvs系列之dr(二)
- [进阶] --- Python3 异步编程详解(史上最全篇)
- 动态照片墙 python 实现_利用python生成照片墙的示例代码
- 这个可能是比你女朋友陪你时间都要久的本子
- 详解印染产品纬斜疵病产生原因及如何预防
- Arthas排查生产环境CPU飚高问题
- linux中touch命令如何使用,Linux touch命令
- tongweb使用之端口冲突处理办法
- 虚拟仿真实验室 服务器,汽车学院虚拟仿真实验室平台
- 【js练习】鼠标按下和松开事件
- day2 数据分析思维课
- android 限制输入 表情以及颜文字及特殊字符
- 移动端如何解决video层级最高的问题
- ZOJ Gold Coins2345
- 内涵段子被永久关停;抖音上线反沉迷系统;苹果推红色版iPhone 8丨价值早报
- 跟着大宇学MySQL------目录帖