【MySQL精通之路】SQL优化(1)-查询优化(5)-引擎条件下推

1 介绍

这种优化提高了无索引列常量之间直接比较的效率。

在这种情况下,条件会“向下推”到存储引擎进行评估。此优化只能由NDB存储引擎使用。

对于NDB集群,这种优化可以消除在集群的数据节点发布查询的MySQL服务器之间通过网络发送不匹配行的操作,并且可以将使用条件下推的查询速度提高5到10倍。

假设NDB Cluster表定义如下:

CREATE TABLE t1 (a INT,b INT,KEY(a)
) ENGINE=NDB;

引擎条件下推可以与查询条件一起使用,例如这里显示的查询,其中包括无索引列常量之间的比较:

SELECT a, b FROM t1 WHERE b = 10;

引擎状态下推的使用可以在EXPLAIN的输出中看到:

mysql> EXPLAIN SELECT a, b FROM t1 WHERE b = 10\G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: t1type: ALL
possible_keys: NULLkey: NULLkey_len: NULLref: NULLrows: 10Extra: Using where with pushed condition

但是,引擎条件下推不能与以下查询一起使用:

SELECT a,b FROM t1 WHERE a = 10;

引擎条件下推不适用于此处,因为列a上存在索引。(索引访问方法会更有效,因此会优先选择)


当使用>或<运算符将索引列与常量进行比较时,也可以使用引擎条件下推:

mysql> EXPLAIN SELECT a, b FROM t1 WHERE a < 2\G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: t1type: range
possible_keys: akey: akey_len: 5ref: NULLrows: 2Extra: Using where with pushed condition

其他支持的引擎条件下推比较包括以下内容:

column [NOT] LIKE pattern

pattern必须是包含要匹配字符串文字;

有关语法,请参阅“字符串比较函数和运算符”。

 column IS [NOT] NULL

 column IN (value_list)

value_list中的每个项都必须是一个常量的文字值。

column BETWEEN constant1 AND constant2

constant1和constnt2必须分别为常量、文字值。

2.设置

在前面列表中的所有情况下,条件都可以转换为常量之间的一个或多个直接比较的形式。

默认情况下,引擎条件下推功能处于启用状态

要在服务器启动时禁用它,请将optimizer_switch系统变量engine_condition_pushdown标志设置为off。

例如,在my.cnf文件中,使用以下行:

[mysqld]
optimizer_switch=engine_condition_pushdown=off

在运行时,禁用条件下推,如下所示:

SET optimizer_switch='engine_condition_pushdown=off';

3.局限性

引擎条件下推受以下限制:

NDB存储引擎支持引擎状态下推。

在NDB 8.0.18之前,仅支持与计算结果为常数值的“常量表达式”进行比较。

在NDB 8.0.18及更高版本中,只要列的类型完全相同,包括相同的符号、长度、字符集、精度和小数位数,就可以相互比较。

比较中使用的列不能是任何BLOBTEXT类型。这种排除也扩展到JSON、BITENUM列。

要与列进行比较的字符串值必须使用与该列相同的排序规则

不直接支持联接;涉及多个表的条件查询在可能的情况下被单独推送。使用扩展的EXPLAIN输出来确定哪些条件实际被下推。

参见“扩展EXPLAIN输出格式”。

以前,引擎条件下推仅限于引用条件被推送到的同一表中的列值的术语。

从NDB 8.0.16开始,查询计划早期表中的列值也可以从推送条件中引用。这减少了SQL节点在联接处理过程中必须处理的行数。

筛选也可以在LDM线程中并行执行,而不是在单个mysqld进程中执行。

这有可能大大提高查询的性能。

从NDB 8.0.20开始,如果在同一联接嵌套中使用的任何表上,或在其上面的联接嵌套中的任何表(它所依赖的)上不存在不可推送条件,则可以使用扫描推送外部联接半联接也是如此,前提是所采用的优化策略是firstMatch

(请参阅“使用半联接转换优化IN和EXISTS子查询谓词”)。

在以下两种情况下,联接算法不能与引用前一个表中的列相结合:

1.当前面引用的任何表都在联接缓冲区中时。在这种情况下,从扫描筛选表中检索的每一行都与缓冲区中的每一行都匹配。这意味着在生成扫描筛选器时,没有可以从中提取列值的特定行。

2.当列 源自被推送的join操作的子操作时。这是因为生成扫描筛选器时,尚未检索联接中原始表操作引用的行。

从NDB 8.0.27开始,联接原始表中的列可以向下推,前提是它们满足前面列出的要求。使用先前创建的表t1的这种查询的示例如下所示:

mysql> EXPLAIN ->   SELECT * FROM t1 AS x ->   LEFT JOIN t1 AS y ->   ON x.a=0 AND y.b>=3\G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: xpartitions: p0,p1type: ALL
possible_keys: NULLkey: NULLkey_len: NULLref: NULLrows: 4filtered: 100.00Extra: NULL
*************************** 2. row ***************************id: 1select_type: SIMPLEtable: ypartitions: p0,p1type: ALL
possible_keys: NULLkey: NULLkey_len: NULLref: NULLrows: 4filtered: 100.00Extra: Using where; Using pushed condition (`test`.`y`.`b` >= 3); Using join buffer (hash join)
2 rows in set, 2 warnings (0.00 sec)

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

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

相关文章

【微服务】springboot 构建镜像多种模式使用详解

目录 一、前言 二、微服务常用的镜像构建方案 3.1 使用Dockerfile 3.2 使用docker plugin插件 3.3 使用docker compose 编排文件 三、环境准备 3.1 服务器 3.2 安装JDK环境 3.2.1 创建目录 3.2.2 下载安装包 3.2.3 配置环境变量 2.2.4 查看java版本 3.3 安装maven …

pyqt 浮动窗口QDockwidget

pyqt 浮动窗口QDockwidget QDockwidget效果代码 QDockwidget QDockWidget 是 PyQt中的一个控件&#xff0c;它提供了一个可以停靠在主窗口边缘或者浮动在屏幕上的窗口小部件&#xff08;widget&#xff09;。QDockWidget 允许用户自定义其界面&#xff0c;并提供了灵活的停靠和…

Keras实现SegNet

我真服了原来我之前用tf复现SegNet给复现错了 在网上试了多个版本代码&#xff0c;折腾了好久&#xff0c;现在终于复现对了&#xff0c;代码也跑通了 SegNet的架构比较老了&#xff0c;这几年都没人更新代码了&#xff0c;我这里算是提供一个最近能跑通的版本的代码吧 tf版本…

Elasticsearch集群许可证过期问题解决方法汇总

最近在使用elasticsearch的过程中,使用elastic-head进行可视化展示集群的状态和信息,从2024年5月18日突然elastic-head无法现在集群的状态界面啦,elasticsearch集群状态是正常,命令如下: curl -X GET "localhost:9200/_cluster/health?pretty" 在google页面上通过…

引流500+创业粉,抖音口播工具

在抖音平台运营一个专注于口播的工具号&#xff0c;旨在集结超过500位热衷于创业的粉丝&#xff0c;这需要精心筹划的内容策略和周到的运营计划。首先&#xff0c;明确你的口播工具号所专注的领域&#xff0c;无论是分享创业经验、财务管理技巧还是案例分析&#xff0c;确保你所…

Axmol 2.1.3 发布

我们非常荣幸&#xff0c;axmol 能在发布此版本之前被 awsome-cpp 收录&#xff01; The 2.1.3 release is a minor LTS release for bugfixes and improvements, thanks to iAndyHD3 add axmol to awsome-cpp The axmol home page was change to https://axmol.dev Signifi…

引入Dao

1.crm和数据库的结合 我们先前实现的crm项目的数据都是自定义的 而非数据库获取 因此现在我们应该实现crm和数据库的集成 ListServlet.java doPost方法中在处理异常的选项中 并没有发现throws方式 而只有try-catch方式 这是因为子类throws的异常必须和父类throws异常一致或者是…

【电子元件】TL431 电压基准

TL431(C23892)是一种常用的可调节精密电压基准和电压调节器。它广泛应用于电源管理、精密参考电压和稳压电路等领域。以下是TL431的一些关键特点和使用方法&#xff1a; 关键特点 可调输出电压&#xff1a;TL431的输出电压可以通过外部电阻网络在2.495V到36V范围内调整。精度高…

淘宝x5sec

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018601872 本文章未…

vuedraggable插件 修改元素首次拖拽进入占位样式

vuedraggable是一款适用于vue3 的可拖拽插件。 通过配置ghost-class“ghost” 属性&#xff0c;可以对组件内元素拖拽过程中的占位符进行修改。但是无法根据ghost这一class对元素首次拖拽进组件内的占位元素进行样式修改 解决方法&#xff1a;元素首次拖拽进vuedraggable 中时…

python 面对对象 类 继承

继承 继承就是为了解决两个有大量重复性代码的类&#xff0c;抽象出一个更抽象的类放公共代码&#xff0c;主要是代码复用&#xff0c;方便代码的管理与修改 类的继承包括属性和方法&#xff0c;私有属性也可继承 class Person(): # 默认是继承object超类pass…

【数据结构(邓俊辉)学习笔记】二叉树03——重构

0 .概述 介绍下二叉树重构 1. 遍历序列 任何一棵二叉树我们都可以导出先序、中序、后序遍历序列。这三个序列的长度相同&#xff0c;他们都是由树中的所有节点依照相应的遍历策略所确定的次序&#xff0c;依次排列而成。 若已知某棵树的遍历序列是否可以忠实地还原出这棵树…

ic基础|时钟篇05:芯片中buffer到底是干嘛的?一文带你了解buffer的作用

大家好&#xff0c;我是数字小熊饼干&#xff0c;一个练习时长两年半的ic打工人。我在两年前通过自学跨行社招加入了IC行业。现在我打算将这两年的工作经验和当初面试时最常问的一些问题进行总结&#xff0c;并通过汇总成文章的形式进行输出&#xff0c;相信无论你是在职的还是…

图片AI高效生成惊艳之作,一键解锁无限创意,轻松打造概念艺术新纪元!

在数字化时代&#xff0c;图片已经成为我们表达创意、传递信息的重要载体。然而&#xff0c;传统的图片生成方式往往耗时耗力&#xff0c;无法满足我们对于高效、创意的需求。幸运的是&#xff0c;现在有了图片AI&#xff0c;它以其高效、智能的特点&#xff0c;为我们带来了全…

微服务-系统架构

微服务&#xff1a; 系统架构的演变 单一应用架构 早期的互联网应用架构&#xff0c;大量应用服务 功能 集中在一个包里&#xff0c;把大量的应用打包为一个jar包&#xff0c;部署在一台服务器&#xff0c;例如tomcat上部署Javaweb项目 缺点:耦合度高&#xff0c;一台服务器…

一千题,No.0014(素数对猜想)

让我们定义dn​为&#xff1a;dn​pn1​−pn​&#xff0c;其中pi​是第i个素数。显然有d1​1&#xff0c;且对于n>1有dn​是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。 现给定任意正整数N(<105)&#xff0c;请计算不超过N的满足猜想的素数对的个数。…

分布式缓存:探讨如何在Java中使用分布式缓存解决方案,比如Redis或Hazelcast等

分布式缓存简介 分布式缓存是一种数据管理策略,它可以帮助我们更有效地使用网络中多台服务器的存储资源,从而提高数据获取的速度。我们可以把数据(如数据库查询结果、计算结果等)存储在这种缓存中,从而提供更快的数据访问速度,减少对原始数据源的访问并降低网络负载。 …

Point-Nerf 理论笔记和理解

文章目录 什么是point nerf 和Nerf 有什么区别Point Nerf 核心结构有哪些&#xff1f;什么是point-based radiance field? 点云位置以及置信度是怎么来Point pruning 和 Point Growing 什么是point nerf 和Nerf 有什么区别 基本的nerf 是通过过拟合MLP来完成任意视角场景的重…

缓存穿透、击穿、雪崩的解决方法

一、缓存穿透指的是查询一个不存在的数据&#xff0c;由于缓存中没有对应的值&#xff0c;每次请求都要查询数据库&#xff0c;容易导致数据库压力过大。 解决方法&#xff1a; 使用布隆过滤器等手段可以在请求到达后台处理之前就过滤掉这些不存在的请求&#xff0c;避免了对数…

gazebo中通过编写插件发布随动关节的角度值到话题

1. cpp 编写 #include <gazebo/gazebo.hh> #include <gazebo/physics/physics.hh> #include <gazebo/common/common.hh> #include <ros/ros.h> #include <std_msgs/Float64.h>namespace gazebo {class PoleJointAnglePublisher : public ModelP…