新特性解读 | MySQL 8.0 对 limit 的优化
作者:杨奇龙
网名“北在南方”,资深 DBA,主要负责数据库架构设计和运维平台开发工作,擅长数据库性能调优、故障诊断。
本文来源:原创投稿
*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
一、前言
提到 limit 优化,大多数 MySQL DBA 都不会陌生,能想到各种应对策略,比如延迟关联,书签式查询等等,之前我也写过一篇优化的文章:https://mp.weixin.qq.com/s/2nSdHiGsu35Yf3fRStzumQ , 有兴趣的朋友可以复习一下。
二、MySQL 8.0 对limit 的改进
对于 limit N 带有 group by ,order by 的 SQL 语句 (order by 和 group by 的字段有索引可以使用),MySQL 优化器会尽可能选择利用现有索引的有序性,减少排序--这看起来是 SQL 的执行计划的最优解,但是实际上效果其实是南辕北辙,相信很多 DBA 遇到的相关案例中 sql 执行计划选择 order by id 的索引进而导致全表扫描,而不是利用 where 条件中的索引查找过滤数据。MySQL 8.0.21 版本之前,并没有什么参数来控制这种行为,但是自 MySQL 8.0.21 之后提供一个优化器参数 prefer_ordering_index
,通过设置 optimizer_switch
来开启或者关闭该特性 。比如:
SET optimizer_switch = "prefer_ordering_index=off";SET optimizer_switch = "prefer_ordering_index=on";
三、实践出真知
测试环境 MySQL 社区版 8.0.30
构造测试数据
CREATE TABLE t (
id1 BIGINT NOT NULL PRIMARY KEY auto_increment,
id2 BIGINT NOT NULL,
c1 VARCHAR(50) NOT NULL,
c2 varchar(50) not null,
INDEX i (id2, c1));insert into t(id2,c1,c2) values(1,'a','xfvs'),(2,'bbbb','xfvs'),(3,'cdddd','xfvs'),(4,'dfdf','xfvs'),(12,'bbbb','xfvs'),(23,'cdddd','xfvs'),(14,'dfdf','xfvs'),
(11,'bbbb','xfvs'),(13,'cdddd','xfvs'),(44,'dfdf','xfvs'),(31,'bbbb','xfvs'),(33,'cdddd','xfvs'),(34,'dfdf','xfvs');
3.1 默认开启参数
mysql (test) > SELECT @@optimizer_switch LIKE '%prefer_ordering_index=on%';
+------------------------------------------------------+
| @@optimizer_switch LIKE '%prefer_ordering_index=on%' |
+------------------------------------------------------+
| 1 |
+------------------------------------------------------+
1 row in set (0.00 sec)
查询非索引字段 ,id2 上有索引 ,order by 主键 id1 ,explain 查看执行计划 type index 说明使用索引扫描使用 using where 过滤结果集。这个是优化器的自以为的最优选择,但是实际上遇到数据集合比较大的表,该执行计划就不是最优解,反而导致慢查。
mysql (test) > explain select c2 from t where id2>8 ORDER BY id1 ASC LIMIT 2\G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: tpartitions: NULLtype: index
possible_keys: ikey: PRIMARYkey_len: 8ref: NULLrows: 2filtered: 69.23Extra: Using where
1 row in set, 1 warning (0.00 sec)
3.2 关闭该参数
mysql (test) > SET optimizer_switch = "prefer_ordering_index=off";mysql (test) > explain select c2 from t where id2>8 ORDER BY id1 ASC LIMIT 2\G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: tpartitions: NULLtype: range
possible_keys: ikey: ikey_len: 8ref: NULLrows: 9filtered: 100.00Extra: Using index condition; Using filesort
1 row in set, 1 warning (0.00 sec)
经过调整之后,查看执行计划发现优化器选择 id2 索引字段找到记录做过滤,并且使用了ICP 特性,减少物理 io 请求,而不是选择使用主键 id1 遍历索引然后回表查询。
显然通过人为介入参数调整优化器的行为能带来更好的优化效果。
四、总结
从不同版本的 MySQL 发展轨迹来看 MySQL 的优化器越来越智能 (比如大家期待已久的直方图特性) ,能更多的减少人为干预,提升执行计划的准确性。
have fun with MySQL 8.0 ^_^
本文关键字:#8.0 新特性# #MySQL# #优化#
相关推荐:
故障分析 | 从 data_free 异常说起
再说 order by 优化技术分享 | 一文了解高并发限流算法
新特性解读 | MySQL 8.0 之原子 DDL
社区投稿 | 如何正确理解 RT 并监控 MySQL 的响应时间
关于SQLE
爱可生开源社区的 SQLE 是一款面向数据库使用者和管理者,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。
SQLE 获取
类型 | 地址 |
---|---|
版本库 | https://github.com/actiontech/sqle |
文档 | https://actiontech.github.io/sqle-docs-cn/ |
发布信息 | https://github.com/actiontech/sqle/releases |
数据审核插件开发文档 | https://actiontech.github.io/sqle-docs-cn/3.modules/3.7_auditplugin/auditplugin_development.html |
更多关于 SQLE 的信息和交流,请加入官方QQ交流群:637150065...
点击阅读原文,详细了解SQLE
新特性解读 | MySQL 8.0 对 limit 的优化相关推荐
- c语言 字符串 正序再倒序_新特性解读 | MySQL 8.0 索引特性3 -倒序索引
原创作者:杨涛涛 我们今天来介绍下 MySQL 8.0 引入的新特性:倒序索引. MySQL长期以来对索引的建立只允许正向asc存储,就算建立了desc,也是忽略掉. 比如对于以下的查询,无法发挥索引 ...
- 中累计直方图_新特性解读 | MySQL 8.0 直方图
原创作者:杨涛涛 MySQL 8.0 推出了histogram,也叫柱状图或者直方图.先来解释下什么叫直方图. 关于直方图 我们知道,在DB中,优化器负责将SQL转换为很多个不同的执行计划,完了从中选 ...
- mysql8导入 psc 没有数据_新特性解读 | MySQL 8.0.22 任意格式数据导入
作者:杨涛涛 资深数据库专家,专研 MySQL 十余年.擅长 MySQL.PostgreSQL.MongoDB 等开源数据库相关的备份恢复.SQL 调优.监控运维.高可用架构设计等.目前任职于爱可生, ...
- mysql 8函数索引_新特性解读 | MySQL 8.0 索引特性1-函数索引
原创作者:杨涛涛 函数索引顾名思义就是加给字段加了函数的索引,这里的函数也可以是表达式.所以也叫表达式索引. MySQL 5.7 推出了虚拟列的功能,MySQL8.0的函数索引内部其实也是依据虚拟列来 ...
- mysql force index报错_新特性解读 | MySQL 8.0 索引特性4-不可见索引
MySQL 8.0 实现了索引的隐藏属性.当然这个特性很多商业数据库早就有了,比如ORACLE,在11g中就实现了.我来介绍下这个小特性. 介绍 INVISIBLE INDEX,不可见索引或者叫隐藏索 ...
- 新特性解读 | MySQL 8.0 对 GTID 的限制解除
作者:杨涛涛 资深数据库专家,专研 MySQL 十余年.擅长 MySQL.PostgreSQL.MongoDB 等开源数据库相关的备份恢复.SQL 调优.监控运维.高可用架构设计等.目前任职于爱可生, ...
- 新特性解读 | MySQL 8.0 新密码策略(上)
作者:杨涛涛 资深数据库专家,专研 MySQL 十余年.擅长 MySQL.PostgreSQL.MongoDB 等开源数据库相关的备份恢复.SQL 调优.监控运维.高可用架构设计等.目前任职于爱可生, ...
- mysql applier_新特性解读 | MySQL 8.0.18 有权限控制的复制
背景 MySQL 8.0.18 以前,从服务器都是在不检查权限的情况下执行复制事务的,这样做是为了能够让主服务器获取所有内容.实际上,这意味着从机完全信任主机.但是,可能存在一些设置,其中更改跨越了主 ...
- concat 不是可以识别的 内置函数名称。_新特性解读 | MySQL 8.0 窗口函数详解
背景 一直以来,MySQL 只有针对聚合函数的汇总类功能,比如MAX, AVG 等,没有从 SQL 层针对聚合类每组展开处理的功能.不过 MySQL 开放了 UDF 接口,可以用 C 来自己写UDF, ...
最新文章
- 【C++基础学习】C++中的引用
- spring中的Aware
- java 进程100_原创:如何排查java进程cpu100%的问题
- 苍溪师范94级计算机与文秘专业就业前景,文秘专业就业前景
- python裁剪图片并保存_python – 如何从图像中剪切轮廓并将其保存到新文件中
- 安全测试之session,cookie
- JavaWeb项目文件夹生成Zip压缩包并下载到本地
- html对话框跳转页面,html页面的简单对话框(alert, confirm, prompt)
- PuTTY 私钥'putty/sshdss.c' 多个信息泄露漏洞
- AJAX问题:如果SESSION丢失,会直接报错。
- Atitit 数据库重复数据产生原因与解决总结 目录 1. 原因	1 1.1. 缺少数据约束校验	1 1.2. 表关系关联设计错误	1 2. 约束种类	1 2.1. 分类 表级约束vs列级别约束	2
- 小米 app消息推送服务器,APP使用小米消息推送自定义铃声iOS版
- android中dex文件的函数解析
- jvm异常生成文件hs_err_pid[pid].log
- 普通大一学生的自我反思
- vue子元素点击事件与父元素点击事件冲突 子元素点击事件不触发
- tshark抓包小结
- 【手写 Vue2.x 源码】第十九篇 - 根据 vnode 创建真实节点
- iCloud Drive,简单实用的苹果原生云存储
- 一年级关于计算机的手抄报内容是什么,一年级语文手抄报内容资料
热门文章
- linux 搭建mqtt服务
- 医院信息管理系统(Python与MySQL数据库的连接与相关增删改查操作)
- 团组织关系的转接流程
- 以前看的关于物联网的总结
- java gef_【插件开发】—— 12 GEF入门
- 为什么剩余数不能相加_为什么花的钱剩下的相加不等于花去的数
- 二次采样设置的四种彩色模式RGB565,ARGB8888,ARGB4444,ALPHA_8
- C#中使用DirectX实现视频播放
- C#中XML、JSON、类T数据格式之间的转换
- 客户成功 | 数据解码技能提升,Smartbi助力长沙烟草找到“新路子”