MySQL 8.0 新特性:Descending Indexes

文若3年前技术文章1073


一、前言

MySQL 8.0 之前的索引排序规则之前只允许 ASC 存储,创建时指定 DESC 也会被忽略,

截屏2021-01-14 上午10.59.32.png

截屏2021-01-13 下午5.38.01.png

8.0 版本为我们带来了 Descending Indexes 降序索引 👏👏👏

只能使用 ASC 索引,带来的问题就是使用 DESC 会出现更多的 using filesort 导致更多的性能损耗

二、动手实验 5.7

  1. 5.7 版本用了一张推荐系统的表,简单测试一下:

explain select similarity from new_correlation group by similarity order by similarity asc ;

Snipaste_2021-01-13_17-57-29.png

此时我们是在 5.7 版本里创建了一个 idx_similarity_desc(similarity desc)  发现虽然创建的是倒序索引,但是没有效果,依然是按照 ASC 组织的。下面是使用 DESC 排序下 SQL 的执行计划:

explain select similarity from new_correlation group by similarity order by similarity desc \G

Snipaste_2021-01-13_18-04-51.png

此时是在 5.7 版本下使用倒序 DESC 我们从执行计划里发现比 ASC 多了 Using temporaryfilesort 使用临时表和文件排序,一般我们认为执行计划中有这两个的性能都不咋地,而且执行频率高的话系统 IO 的压力也会非常大,比如羽勒的内站系统数据库,配置只有 2C4G 有一个业务必须使用 DESC 排序,并发上来时 CPU 可以顶得住 IOPS 却已经到极限了。


那么到底是有多大区别呢?请继续往下看


我们使用 MySQL 执行监控计数器看看二者的区别~

下方是使用 ASC 时的计数器 Handler_read_key 较高说明查询及索引均使用正确。

Snipaste_2021-01-13_19-21-35.png

下面是使用 DESC 时计数器,发现多了很多计数 Handler_read_rnd_next 从数据节点读取到下一个数据节点的次数,说明索引使用不正常,消耗的资源也是比 ASC 大许多。

Snipaste_2021-01-13_19-22-21.png

我们可以看到 5.7 即使我们创建 DESC 索引但是依然是按照 ASC 排序的,某些情况下是比较消耗性能的。

Snipaste_2021-01-13_19-29-18.png

三、8.0 新特性改善

我们到 8.0 中重新运行刚才的 SQL 我们添加 DESC 索引

alter table new_correlation add index idx_similarity_desc(similarity desc);

Snipaste_2021-01-13_19-35-44.png

发现 Using temporaryfilesort 已经没有了,使用了 idx_similarity_desc 索引,统计信息如下👇 创建的倒序索引不再失效。

Snipaste_2021-01-13_19-37-39.png

后面我们可以根据业务情况创建合适组织顺序的索引,减少更多不必要的性能损耗。

相关文章

nginx配置反向代理某个url

nginx配置反向代理某个url

本文讲的这个漏洞 主要是为了解决漏洞扫描的问题我先介绍下这个漏洞主要是因为访问https://172.16.120.17:18090/ws/v1/cluster/info这个 yarn rest的一个...

rds pg10 ssd云盘升级磁盘类型方案

rds pg10 ssd云盘升级磁盘类型方案

1、升级方案一原实例变更配置方案优缺点:优点:操作方便,升级后能保证数据和存储过程都是正常的。缺点:停机时间较长,整个变更配置期间业务不可用。变更步骤参考:在配置信息区域单击变更配置。(仅包年包月实例...

ranger审计日志对接CDH solr

ranger审计日志对接CDH solr

一、准备条件1、已安装完毕ranger-admin2、已在CDH上部署solr(注意在安装solr时更改下solr在zk上的节点信息)二、更改相关配置1、修改ranger-2.1.0-admin/co...

MySQL运维实战(4.2) 关于SQL_MODE

早期mysql对一些不符合SQL标准的SQL语句和数据的容忍度比较高。mysql 5.7 修改了默认sql mode。系统从低版本升级或迁移到高版本时,需要经过全面的测试,避免影响程序的正常运行。5....

Python 类型注解和参数类型检查

1、类型注解1.1 函数定义的弊端Python 是动态语言,变量随时可以被赋值,且能赋值为不同的类型。Python 不是静态编译型语言,变量类型是在运行期决定的。动态语言很灵活,但是这种特性也是弊端。...

MySQL运维实战之ProxySQL(9.4)proxysql和后端MySQL自动切换

MySQL运维实战之ProxySQL(9.4)proxysql和后端MySQL自动切换

如上图架构,当后端MySQL主库出现问题,发生主备切换后,如何自动将ProxySQL的读写切换到新的主库上?可以通过mysql_replication_hostgroups表配置实现:insert&n...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。