MYSQL prefer_order_index 的罪责

news2024/9/20 5:35:57

c2426cf8cf4a93edbe1d7594593fef82.png

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共700多人左右 1 + 2)。

最近我们在使用MYSQL 8 的情况下(8.025) 在数据库运行中出现一个问题 参数prefer_order_index 的问题, 熟悉 MYSQL的同学看到这个参数估计都是恨的牙根痒痒,这个参数的想法是好的,仅仅是限于想法是好的。

数据库中的优化器的工作就是选择更好的执行的方式来将SQL语句给出最好的方案来执行,那么评估一个SQL的好坏的方式就是代价cost 最小或者尽可能的小, cost 小了,则我们可以认为是  IOPS, CPU 的消耗都会减少,这就是我们希望看到的。

那么怎么能这样,回答可能是扫描的行数要少,那么用这个思路我们串一下。

MYSQL的优化器判断语句执行路径---- 评判执行计划的COST---- 扫描的行数少----成本低---  推出执行计划

2050becd8ac376f8dd8605c51796c118.png

所以这期就的说说在这样的优化思路下的 prefer_order_index 的参数在MYSQL 8 默认开启后的问题。 

4d832a7d4b3c84cca08e5f807a07941b.png

这个参数如果大家细心的情况下,在我们的MYSQL 5.7 也有这个参数,而且这个参数是关闭的见上图。先说说这个参数的历史,这个参数是在 MYSQL5.7.33 版本上产生的,目的就是为了要提高整体的SQL 在运行ORDER BY  LIMIT  GROUP BY 时,可以选择有序索引提高数据排序的的速度和 提高语句执行的效率。但是基于一贯的风格,这个参数虽然在MYSQL 5.7.33 中推出但默认是关闭的所以当时的使用这个版本的应用并未受到影响,而这个参数发布的版本也是MYSQL5.7 最靠后的版本,所以这边版本本身就使用的人少。

而后到了MYSQL8.X 这个参数得到了进化,除了对ORDER BY 和 GROUP BY 进行优化的后,还加入了 limit  的考虑的元素, 并且这个一开始的设定就是参数开启的状态,这个参数实际上在 8.021 的这个版本上重新启用了,并且一开始默认是开启的,这样一搞,就出现很多的SQL 运行时的故障。

我们看下面这个例子

a16da0531a4ba4d820d36117ad17d869.png

一个1000万的表,然后我们有相关的主键和索引,我们对这个表发起下面的查询方式。

3706d40e1d27b4c0d89526d2568da1c9.png

在打开这个参数后,用下面的语句来进行运算,则

mysql> set optimizer_switch = "prefer_ordering_index=on";

Query OK, 0 rows affected (0.00 sec)

mysql> select * from t_user where age >= 20 and age < 50 order by id limit 10;

5144daad3c5b03538c885dd764dc7993.png

mysql> set optimizer_switch = "prefer_ordering_index=off";

Query OK, 0 rows affected (0.00 sec)

mysql> select * from t_user where age >= 20 and age < 50 order by id limit 10;

28e6b91873b89b9aab7f31b8774f30bd.png

这里明显的结果是打开这个参数后,运行的结果会很快给出,但是关闭后,性能会较低。

所以在这样的情况下,可以证明打开对于数据查询的性能是有提高的,但是如果我们针对一些特殊的场景来看,这个参数打开后,会导致同一个SQL 部分SQL 稍许变动后,导致的执行计划不稳定的情况。

a25429ff968ed7363e661be3415e9441.png

mysql> set optimizer_switch = "prefer_ordering_index=on";

Query OK, 0 rows affected (0.00 sec)

mysql> 

mysql> 

mysql> explain select * from t_user where age > 20 and age < 22 order by id  limit 10,20;

+----+-------------+--------+------------+-------+---------------+---------+---------+------+------+----------+-------------+

| id | select_type | table  | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra       |

+----+-------------+--------+------------+-------+---------------+---------+---------+------+------+----------+-------------+

|  1 | SIMPLE      | t_user | NULL       | index | idx_age       | PRIMARY | 8       | NULL |  604 |     4.96 | Using where |

+----+-------------+--------+------------+-------+---------------+---------+---------+------+------+----------+-------------+

1 row in set, 1 warning (0.00 sec)

mysql> explain select * from t_user where age > 20 and age < 22 order by id  limit 10000,10010;

+----+-------------+--------+------------+-------+---------------+---------+---------+------+-------+----------+---------------------------------------+

| id | select_type | table  | partitions | type  | possible_keys | key     | key_len | ref  | rows  | filtered | Extra                                 |

+----+-------------+--------+------------+-------+---------------+---------+---------+------+-------+----------+---------------------------------------+

|  1 | SIMPLE      | t_user | NULL       | range | idx_age       | idx_age | 2       | NULL | 49484 |   100.00 | Using index condition; Using filesort |

+----+-------------+--------+------------+-------+---------------+---------+---------+------+-------+----------+---------------------------------------+

1 row in set, 1 warning (0.00 sec)

而在MYSQL 曾经提交的BUG 中也有这个部分的身影,所以 prefer_order_index 的参数是一个双刃剑,如果你打开了这个参数,那么如果你发现一些语句突发性的变慢,不要慌张,先看看是不是这个参数打开导致的问题,尤其是 order by  limit 的SQL。

如果你想更清楚问题可以查找下面的两个BUG  OF MYSQL 

  • Bug#74602: Optimizer prefers wrong index because of low limit

  • Bug#78612: Optimizer chooses wrong index for ORDER BY

912f28ffca504096ddf142b6e0638b8d.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/466825.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux运维之初识shell

一.补充知识点 1.系统定时任务 系统定时任务需要用到crontab命令&#xff0c;但是使用此命令有一个前提&#xff0c;即需要打开crond服务。为了不那么复杂&#xff0c;可以直接使用我之前学的systemctl命令重新启动crond服务。 语法&#xff1a;crontab [-e -l -r] 选项&am…

安装zsh-theme oh-my-zsh

安装zsh yum install zsh切换到zsh chsh -s /bin/zsh exec /bin/zsh重启并且查看 echo $SHELL//查看当前shell,如果显示/bin/zsh&#xff0c;则配置成功 安装oh my zsh sh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"到…

浅谈Java线程

大家好&#xff0c;我是易安&#xff01;今天我们简单聊下Java线程这个话题。 在Java领域&#xff0c;实现并发程序的主要手段就是多线程。线程是操作系统里的一个概念&#xff0c;虽然各种不同的开发语言如Java、C#等都对其进行了封装&#xff0c;但是万变不离操作系统。Java语…

您的天气类APP会泄露隐私吗?

不知您是否有这样的习惯&#xff0c;在早上出门前、或是在规划次日的行程时&#xff0c;都会不自觉地掏出手机、点开天气类APP进行查看。此类APP有的是智能手机自带的&#xff0c;有的是从应用商店里下载并获取的第三方应用。无论是哪种&#xff0c;它们往往都有着一个共性&…

网络安全合规-汽车行业数据合规

个人信息&#xff0c;是指以电子或者其他方式记录的与已识别或者可识别的车主、驾驶人、乘车 人、车外人员等有关的各种信息&#xff0c;不包括匿名化处理后的信息。 敏感个人信息&#xff0c;是指一旦泄露或者非法使用&#xff0c;可能导致车主、驾驶人、乘车人、车外人员等受…

神策营销云时效性升级,秒级营销即刻开启

信息化时代&#xff0c;时效性成为企业营销与管理的重要竞争力之一。高时效营销能够帮助企业提高决策效率、降低成本&#xff0c;“争分夺秒”留住用户并给用户带来更好的体验&#xff0c;它是促成企业成功营销的关键。 为了帮助企业全面提升营销时效性&#xff0c;神策营销云即…

一次修改jar包中字节码文件内容的尝试

目录 背景解决办法确定修改位置得到字节码文件修改字节码文件组合jar包 背景 最近想实现按照分节符拆分doc / docx文档的功能&#xff0c;然后就找到了这篇文章Java 按节拆分 Word 文档&#xff0c;用的依赖是&#xff1a; <dependency><groupId>e-iceblue</g…

Arduno ESP8266接入OneNET实时显示DHT11数据

Arduno ESP8266接入OneNET实时显示DHT11数据 📌相关篇《OneNET云平台数据APP端查看说明》📍《Arduno ESP8266接入中移OneNet动态显示实时数据》✨上面一篇主要是验证数据上传可行性,这次采用DHT11温湿度传感器上传真实数据到云平台进行检测,同时使用SSD1306屏幕进行数据显…

简单聊聊目标检测新范式RT-DETR的骨干:HGNetv2

【前言】 本文版权属于GiantPandaCV&#xff0c;未经许可&#xff0c;请勿转账&#xff01; 前几天疯狂刷屏的RT-DETR赚足了眼球&#xff0c;在精度和速度上体现的优势和性价比远远高于YOLO&#xff0c;而今年ChatGPT、Sam的出现&#xff0c;也让一些吃瓜群众知乎CNN没有未来了…

第8章:树

1.树是什么 一种分层数据的抽象模型前端工作中常见的树包括&#xff1a;DOM树&#xff0c;级联选择(省市区)&#xff0c;树形控件&#xff0c;…javascript中没有树&#xff0c;但是可以用Object和Array构建树 4.树的常用操作&#xff1a;深度/广度优先遍历&#xff0c;先中后…

【传统方式部署zookeeper集群与迁移至k8s】

zookeeper简介&#xff1a; zk主要服务于分布式系统、配置管理、注册中心、集群管理等&#xff1b;为什么要迁移Zookeeper集群&#xff1b;存储kafka什么数据&#xff1a;kafka有多少节点、topic名称、协调kafka正常运行。ELKKafka收集k8s日志&#xff1b;一、传统方式部署zook…

浙江省区块链数字资产登记中心筹备会议顺利举行

4月25日下午&#xff0c;由浙江省区块链技术应用协会主办、西溪谷管委会、西湖区网联会协办的“浙江省区块链数字资产登记中心筹备会议”在西湖蚂蚁小镇多功能厅顺利举行。 出席本次筹备会议的有中国电子技术标准化研究院区块链研究室主任、IEEE 计算机 协会区块链和分布式记帐…

设计模式--桥接模式

传统方案解决手机操作问题分析 (1) 扩展性问题(类爆炸) 如果我们再增加手机的样式(全面屏) 就需要增加各个品牌手机的类 同样如果我们增加一个手机品牌 也要在各个手机样式类下增加 (2) 违反了单一职责原则 当我们增加手机样式时 要同时增加所有品牌的手机 增大了代码维护成本…

【STM32】基础知识 第九课 STM32启动

【STM32】基础知识 第九课 STM32启动 MAP 文件MAP 文件浅析MAP 文件组成atk_f103.map 文件 启动模式STM32 启动模式 (F1) STM32 启动过程启动文件介绍Reset_Handler 函数介绍堆栈简介 MAP 文件 MAP 文件是 MDK 编译代码后, 产生的集程序, 数据及 IO 空间的一种映射列表文件. 简…

谁是液冷行业真龙头?疯狂的液冷技术!

“人工智能领域AIGC”、“ChatGPT”、“数据特区”、“东数西算”、“数据中心”&#xff0c;可以说是2023年最热的概念&#xff0c;算力提升的背后&#xff0c;处理器的功耗越来越高&#xff0c;想发挥出处理器的最高性能&#xff0c;需要更高的散热效率。 算力井喷之下&…

Blender 建模案例一(1)

目录 1. 指环1.1 创建一个柱体1.2 柱体微调1.3 缩放1.4 应用缩放1.5 物体属性回归默认1.6 进入编辑模式1.7 内插面1.8 桥接循环边1.9 添加表面细分修改器1.10 平滑着色1.11 添加环切 2. 卷轴2.1 添加曲线2.2 进入正交前视图2.3 添加节点2.4 曲线转3D 1. 指环 1.1 创建一个柱体…

Wifi ESL方案介绍

革新点&#xff1a; 7.5寸墨水屏显示WIFI无线通信&#xff0c;极简部署&#xff0c;远程控制按键及LED指示灯指示640*384点阵屏幕锂电池供电&#xff0c;支持USB充电DIY界面支持文本/条码/二维码/图片超低功耗/超长寿命&#xff0c;一次充电可用一年基于现有Wifi环境&#xff…

APS54083 深度调光降压恒流驱动IC 8A LED摩托汽车舞台工作灯IC PWM调光 优化线路图

APS54083 是一款 PWM 工作模式,高效率、外 围简单、外置功率 MOS 管&#xff0c;适用于 5-220V 输入高精度降压 LED 恒流驱动芯片。输出最大 功率150W最大电流 6A。APS54083 可实现线 性调光和 PWM 调光&#xff0c;线性调光脚有效电压 范围 0.5-2.5V.PWM 调光频率范围 1…

第一天 :虚拟机的安装、Centos的安装、FinalShell的安装

Linux学习之虚拟机的安装 一、虚拟机的下载二、虚拟机的安装三、Centos的安装四、vm中安装centos五、finalShell安装 一、虚拟机的下载 1、进入安装官网https://www.vmware.com/cn/products/workstation-pro.html 2、下滑点击试用版下载 3、点击后在新页面下滑&#xff0c;找…

CnOpenData中国汽车能源消耗量数据

一、数据简介 工业和信息化部组织制定的《乘用车燃料消耗量限值》强制性国家标准&#xff08;GB19578-2021&#xff09;于2021年7月1日起正式实施&#xff0c;该标准规定了燃用汽油或柴油燃料、最大设计总质量不超过3500kg的M1类车辆在今后一段时期的燃料消耗量限值要求&#x…