原创作者:杨涛涛


我们今天来介绍下 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 -倒序索引相关推荐

  1. c语言 字符串 正序再倒序_python字符串

    索引:通过下标来获取元素,从零开始 从左到右为正序,从零开始 从右往左为倒序,最右边为-1,倒数第二为-2,...... str="python" print(str[1]) # ...

  2. c语言 字符串 正序再倒序_MySQL - 字符串索引优化

    字符串建立索引的优化 1. 建立前缀索引 假设建立一个支持邮箱登录的用户表,对于邮件字段来说,可以有以下几种建立索引的方式: 直接对整个字符串建立索引 alter table SUser add in ...

  3. 中累计直方图_新特性解读 | MySQL 8.0 直方图

    原创作者:杨涛涛 MySQL 8.0 推出了histogram,也叫柱状图或者直方图.先来解释下什么叫直方图. 关于直方图 我们知道,在DB中,优化器负责将SQL转换为很多个不同的执行计划,完了从中选 ...

  4. c语言字符串正序反序连接输出,C语言中字符串实现正序与逆序实例详解

    C语言中字符串实现逆序实例详解 字符串逆序和正序的实现代码: #include #include #include #include #include /*定义*/ typedef struct no ...

  5. mysql 8函数索引_新特性解读 | MySQL 8.0 索引特性1-函数索引

    原创作者:杨涛涛 函数索引顾名思义就是加给字段加了函数的索引,这里的函数也可以是表达式.所以也叫表达式索引. MySQL 5.7 推出了虚拟列的功能,MySQL8.0的函数索引内部其实也是依据虚拟列来 ...

  6. concat 不是可以识别的 内置函数名称。_新特性解读 | MySQL 8.0 窗口函数详解

    背景 一直以来,MySQL 只有针对聚合函数的汇总类功能,比如MAX, AVG 等,没有从 SQL 层针对聚合类每组展开处理的功能.不过 MySQL 开放了 UDF 接口,可以用 C 来自己写UDF, ...

  7. 端口如何支持非localhost访问_新特性解读 | MySQL 8.0.19 支持 DNS SRV

    转载自公众号:玩转MySQL 作者:洪斌 MySQL Router 是 InnoDB Cluster 架构的访问入口,在架构部署上,官方给出的建议是 router 与应用端绑定部署,避免 router ...

  8. mysql8导入 psc 没有数据_新特性解读 | MySQL 8.0.22 任意格式数据导入

    作者:杨涛涛 资深数据库专家,专研 MySQL 十余年.擅长 MySQL.PostgreSQL.MongoDB 等开源数据库相关的备份恢复.SQL 调优.监控运维.高可用架构设计等.目前任职于爱可生, ...

  9. mysql force index报错_新特性解读 | MySQL 8.0 索引特性4-不可见索引

    MySQL 8.0 实现了索引的隐藏属性.当然这个特性很多商业数据库早就有了,比如ORACLE,在11g中就实现了.我来介绍下这个小特性. 介绍 INVISIBLE INDEX,不可见索引或者叫隐藏索 ...

最新文章

  1. python面试常见问题-Python面试常见的8个问题及答案总结
  2. TP5 实现转盘抽奖
  3. 在Windows XP里,设置USB只读
  4. [JSOI2008]星球大战
  5. lvs系列之dr(二)
  6. [进阶] --- Python3 异步编程详解(史上最全篇)
  7. 动态照片墙 python 实现_利用python生成照片墙的示例代码
  8. 这个可能是比你女朋友陪你时间都要久的本子
  9. 详解印染产品纬斜疵病产生原因及如何预防
  10. Arthas排查生产环境CPU飚高问题
  11. linux中touch命令如何使用,Linux touch命令
  12. tongweb使用之端口冲突处理办法
  13. 虚拟仿真实验室 服务器,汽车学院虚拟仿真实验室平台
  14. 【js练习】鼠标按下和松开事件
  15. day2 数据分析思维课
  16. android 限制输入 表情以及颜文字及特殊字符
  17. 移动端如何解决video层级最高的问题
  18. ZOJ Gold Coins2345
  19. 内涵段子被永久关停;抖音上线反沉迷系统;苹果推红色版iPhone 8丨价值早报
  20. 跟着大宇学MySQL------目录帖

热门文章

  1. Ubuntu下搭建Janus Server
  2. Hive安装及常用交互命令
  3. 学习方法之02掌握记忆方法,在学习上就赢了一半
  4. Syslog系统日志配置
  5. nginx源码分析configure脚本详解
  6. linux编译openssl
  7. 大剑无锋之内存泄漏是什么?【面试推荐】
  8. Spark _08窄依赖和宽依赖stage
  9. 通过 crontab将linux中的top信息写入文件中
  10. leetcode 927. Three Equal Parts | 927. 三等分(Java)