MySQL 8.0中新增的功能(七)

EXPLAIN ANALYZE 语句

在MySQL 8.0.18中引入了一种新形式的EXPLAIN语句,即EXPLAIN ANALYZE,它提供了关于SELECT语句执行的扩展信息,以TREE格式显示查询过程中每个迭代器的执行计划,并可以比较查询的预计成本与实际成本。这些信息包括启动成本、总成本、该迭代器返回的行数以及执行的循环次数。
在MySQL 8.0.21及更高版本中,该语句还支持FORMAT=TREE说明符。TREE是唯一支持的格式。

查询类型转换注入

在MySQL 8.0.18及更高版本中,MySQL将类型转换操作插入到表达式和条件内的查询项目树中,当参数的数据类型与预期的数据类型不匹配时。这对查询结果或执行速度没有影响,但使得执行的查询等效于符合SQL标准的查询,同时保持与之前MySQL版本的向后兼容性。

在MySQL 8.0.18及更高版本中,现在在使用任何标准的数值比较运算符(=、>=、>、<、<=、<>/!=或<=>)进行比较时,会在时间类型(DATE、DATETIME、TIMESTAMP、TIME)和数值类型(SMALLINT、TINYINT、MEDIUMINT、INT/INTEGER、BIGINT、DECIMAL/NUMERIC、FLOAT、DOUBLE、REAL、BIT)之间执行隐式转换。在这种情况下,任何不是DOUBLE的值都被强制转换为DOUBLE类型。还会在DATE或TIME值与DATETIME值之间的比较中进行转换注入,其中根据需要将参数转换为DATETIME类型。

从MySQL 8.0.21开始,还会在将字符串类型与其他类型进行比较时执行此类转换。需要进行转换的字符串类型包括CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。当将字符串类型的值与数值类型或YEAR进行比较时,字符串被转换为DOUBLE;如果另一个参数的类型不是FLOAT、DOUBLE或REAL,则它也被转换为DOUBLE。当将字符串类型与DATETIME或TIMESTAMP值进行比较时,字符串被转换为DATETIME;当将字符串类型与DATE进行比较时,字符串被转换为DATE。

可以通过查看EXPLAIN ANALYZE,EXPLAIN FORMAT=JSON或EXPLAIN FORMAT=TREE的输出,来了解何时在给定的查询中进行了类型转换注入。

mysql> CREATE TABLE d (dt DATETIME, d DATE, t TIME);
Query OK, 0 rows affected (0.62 sec)
mysql> CREATE TABLE n (i INT, d DECIMAL, f FLOAT, dc DECIMAL);
Query OK, 0 rows affected (0.51 sec)
mysql> CREATE TABLE s (c CHAR(25), vc VARCHAR(25),-> bn BINARY(50), vb VARBINARY(50), b BLOB, t TEXT,-> e ENUM('a', 'b', 'c'), se SET('x' ,'y', 'z'));
Query OK, 0 rows affected (0.50 sec)
mysql> EXPLAIN FORMAT=TREE SELECT * from d JOIN n ON d.dt = n.i\G
*************************** 1. row ***************************
EXPLAIN: -> Inner hash join (cast(d.dt as double) = cast(n.i as double))
(cost=0.70 rows=1)-> Table scan on n (cost=0.35 rows=1)-> Hash-> Table scan on d (cost=0.35 rows=1)
mysql> EXPLAIN FORMAT=TREE SELECT * from s JOIN d ON d.dt = s.c\G
*************************** 1. row ***************************
EXPLAIN: -> Inner hash join (d.dt = cast(s.c as datetime(6))) (cost=0.72 rows=1)-> Table scan on d (cost=0.37 rows=1)-> Hash-> Table scan on s (cost=0.35 rows=1)
1 row in set (0.01 sec)
mysql> EXPLAIN FORMAT=TREE SELECT * from n JOIN s ON n.d = s.c\G
*************************** 1. row ***************************
EXPLAIN: -> Inner hash join (cast(n.d as double) = cast(s.c as double)) (cost=0.70 rows=1)-> Table scan on s (cost=0.35 rows=1)-> Hash-> Table scan on n (cost=0.35 rows=1)
1 row in set (0.00 sec)

通过执行EXPLAIN [FORMAT=TRADITIONAL]语句,也可以看到这样的类型转换。在这种情况下,还需要在执行EXPLAIN语句之后执行SHOW WARNINGS语句。

TIMESTAMP和DATETIME类型的时间区域支持

从MySQL 8.0.19版本开始,服务器接受在插入日期时间(TIMESTAMP和DATETIME)值时使用的时区偏移量。这个偏移量的格式与设置time_zone系统变量时使用的格式相同,只是当偏移量的小时部分小于10时,需要前导零,并且不允许使用“-00:00”。包含时区偏移量的日期时间字面值的示例包括'2019-12-11 10:40:30-05:00'、'2003-04-14 03:30:00+10:00'和'2020-01-01 15:35:45+05:30'。

当选择日期时间值时,不会显示时区偏移量。

包含时区偏移量的日期时间字面值可以用作预处理语句的参数值。

作为这项工作的一部分,用于设置time_zone系统变量的值现在也被限制在-13:59到+14:00的范围内(包括边界)。(仍然可以将名称值分配给time_zone变量,例如'EST','Posix/Australia/Brisbane'和'Europe/Stockholm',前提是加载了MySQL时区表。

JSON模式CHECK约束失败的详细信息

在MySQL 8.0.19及更高版本中,当使用JSON_SCHEMA_VALID()来指定CHECK约束时,提供了关于此类约束失败原因的精确信息。

使用ON DUPLICATE KEY UPDATE时的行和列别名

从MySQL 8.0.19版本开始,可以使用别名引用要插入的行,以及可选地引用其列。考虑以下对具有列a和b的表t执行的INSERT语句:

INSERT INTO t SET a=9,b=5ON DUPLICATE KEY UPDATE a=VALUES(a)+VALUES(b);

使用别名"new"表示新行,并在某些情况下使用别名"m"和"n"表示该行的列,可以对INSERT语句进行多种不同的重写。以下是一些示例:

INSERT INTO t SET a=9,b=5 AS newON DUPLICATE KEY UPDATE a=new.a+new.b;
INSERT INTO t VALUES(9,5) AS newON DUPLICATE KEY UPDATE a=new.a+new.b;
INSERT INTO t SET a=9,b=5 AS new(m,n)ON DUPLICATE KEY UPDATE a=m+n;
INSERT INTO t VALUES(9,5) AS new(m,n)ON DUPLICATE KEY UPDATE a=m+n;
SQL标准中的显式表子句和表值构造器

根据SQL标准,MySQL 8.0.19引入了表值构造器(Table Value Constructor)和显式表子句(Explicit Table Clause)。这两个功能分别通过 ​TABLE​语句和 ​VALUES​语句进行实现。

  1. ​TABLE​语句的格式为 ​TABLE table_name​,它等同于 ​SELECT * FROM table_name​。它支持 ​ORDER BY​和 ​LIMIT​子句(后者可选包括 ​OFFSET​),但不允许选择单个表列。​TABLE​语句可以在任何需要相应 ​SELECT​语句的地方使用,包括连接、联合查询、插入选择、替换、创建表选择语句和子查询。例如:

    • ​TABLE t1 UNION TABLE t2​ 等同于 ​SELECT * FROM t1 UNION SELECT * FROM t2
    • ​CREATE TABLE t2 TABLE t1​ 等同于 ​CREATE TABLE t2 SELECT * FROM t1
    • ​SELECT a FROM t1 WHERE b > ANY (TABLE t2)​ 等同于 ​SELECT a FROM t1 WHERE b > ANY (SELECT * FROM t2)
  2. ​VALUES​语句用于向 ​INSERT​、​REPLACE​或 ​SELECT​语句提供一个表值,它由 ​VALUES​关键字后跟一系列行构造器(​ROW()​)组成,以逗号分隔。例如,语句 ​INSERT INTO t1 VALUES ROW(1,2,3), ROW(4,5,6), ROW(7,8,9)​ 提供了与MySQL特定的 ​INSERT INTO t1 VALUES (1,2,3), (4,5,6), (7,8,9)​等效的标准SQL。您还可以从 ​VALUES​表值构造器中进行选择,就像选择任何其他表一样,当这样做时,您必须提供一个表别名,并且可以像处理其他表一样使用这个 ​SELECT​语句,包括联接、联合和子查询。

FORCE INDEX和IGNORE INDEX的优化提示 

新的优化提示如下,并附有它们的FORCE INDEX或IGNORE INDEX等效提示:

  • GROUP_INDEX: 等同于FORCE INDEX FOR GROUP BY
  • NO_GROUP_INDEX: 等同于IGNORE INDEX FOR GROUP BY
  • JOIN_INDEX: 等同于FORCE INDEX FOR JOIN
  • NO_JOIN_INDEX: 等同于IGNORE INDEX FOR JOIN
  • ORDER_INDEX: 等同于FORCE INDEX FOR ORDER BY
  • NO_ORDER_INDEX: 等同于IGNORE INDEX FOR ORDER BY
  • INDEX: 相当于GROUP_INDEX加上JOIN_INDEX和ORDER_INDEX;等同于没有修饰符的FORCE INDEX
  • NO_INDEX: 相当于NO_GROUP_INDEX加上NO_JOIN_INDEX和NO_ORDER_INDEX;等同于没有修饰符的IGNORE INDEX

例如,以下两个查询是等价的:

SELECT a FROM t1 FORCE INDEX (i_a) FOR JOIN WHERE a=1 AND b=2;
SELECT /*+ JOIN_INDEX(t1 i_a) */ a FROM t1 WHERE a=1 AND b=2;

以前列出的优化提示遵循与现有索引级别优化提示相同的基本语法和用法规则。

这些优化提示旨在替代FORCE INDEX和IGNORE INDEX,我们计划在未来的MySQL版本中弃用它们,并随后从MySQL中删除它们。它们没有为USE INDEX提供单个完全等效的提示;而是可以使用NO_INDEX、NO_JOIN_INDEX、NO_GROUP_INDEX或NO_ORDER_INDEX中的一个或多个来实现相同的效果。

JSON_VALUE() 函数

MySQL 8.0.21引入了一个名为JSON_VALUE()的新函数,旨在简化对JSON列的索引。它的最基本形式是以一个JSON文档和一个指向该文档中单个值的JSON路径作为参数,还可以使用RETURNING关键字可选地指定返回类型。JSON_VALUE(json_doc, path RETURNING type) 等同于以下表达式:

CAST(JSON_UNQUOTE( JSON_EXTRACT(json_doc, path) )AS type
);

您还可以类似于在JSON_TABLE()中使用的方式,指定ON EMPTY、ON ERROR或两者都指定的子句。

您可以使用JSON_VALUE()函数在JSON列上创建表达式索引,如下所示:

CREATE TABLE t1(j JSON,INDEX i1 ( (JSON_VALUE(j, '$.id' RETURNING UNSIGNED)) )
);
INSERT INTO t1 VALUES ROW('{"id": "123", "name": "shoes", "price": "49.95"}');

一个使用这个表达式的查询,就像下面展示的那样,可以利用这个索引:

SELECT name, price FROM t1WHERE JSON_VALUE(j, '$.id' RETURNING UNSIGNED) = 123;

在许多情况下,使用JSON_VALUE()函数直接在JSON列上创建索引会比先创建一个生成列然后再在这个生成列上创建索引更简单。

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

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

相关文章

类和对象的定义以及使用

文章目录 1. 类和对象的基本概念1.1 JAVA是面向对象语言1.2 类和对象的描述 2. 类与对象的定义与使用2.1 类的定义格式2.2 类的实例化(对象的创建)2.3 举个例子 3. 对象的构造及初始化3.1构造方法3.1.1构造方法的定义3.1.2 构造方法的特性 4.2 默认初始化5.4 就地初始化 4.this…

微信群机器人:科技与社交的完美结合

在当今这个数字化时代&#xff0c;微信已经成为人们生活中不可或缺的社交工具。而在微信群组中&#xff0c;机器人作为一种新型的互动方式&#xff0c;正逐渐受到人们的青睐。微信群机器人不仅为群组带来了便利&#xff0c;还为群组成员之间的交流增添了趣味性。本文将探讨微信…

C语言实现特殊数列前n项之和

在本篇博客中&#xff0c;我们将深入剖析一段C语言程序&#xff0c;该程序用于计算一个特定结构数列的前n项之和。这个数列的每一项都由同一数字a重复拼接而成&#xff0c;随着项数的增加&#xff0c;该数字会按照十进制位向左延展。例如&#xff0c;如果给定数字a 2&#xff…

二叉树题目:好叶子结点对的数量

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;好叶子结点对的数量 出处&#xff1a;1530. 好叶子结点对的数量 难度 6 级 题目描述 要求 给定二叉树的根结点 root \texttt{root} root 和整数 …

【Python学习】Python学习5-条件语句

目录 【Python学习】Python学习5-条件语句 前言if语句if语句判断条件简单的语句组参考 文章所属专区 Python学习 前言 本章节主要说明Python的条件语句&#xff0c;Python条件语句是通过一条或多条语句的执行结果&#xff08;True或者False&#xff09;来决定执行的代码块。 …

记一个集群环境部署不完整导致的BUG

一 背景 产品有三个环境&#xff1a;开发测试环境、验收环境、生产环境。 开发测试环境&#xff0c;保持最新的更新&#xff1b; 验收环境&#xff0c;阶段待发布内容&#xff1b; 生产环境&#xff0c;部署稳定内容。 产品为BS架构&#xff0c;后端采用微服务&#xf…

我们找项目外包要注意些什么?

当我们要做一个项目的时候&#xff0c;往往采用外包或自研的方式。外包&#xff0c;就是把项目交出去给外面的人去做。一般分为项目外包和人力外包。人力外包很简单&#xff0c;就是个人充当类似员工的角色&#xff0c;为你开展服务&#xff0c;这种模式一般按时间或者项目付费…

如何查看崩溃日志

目录 描述 思路 查看ipa包崩溃日志 简单查看手机崩溃信息几种方式 方式1:手机设置查看崩溃日志 方式2: Xocde工具 方式3: 第三方软件克魔助手 环境配置 实时日志 奔溃日志分析 方式四&#xff1a;控制台资源库 线上崩溃日志 线上监听crash的几种方式 方式1: 三方平…

[pkg-config] 第三方软件包/库管理工具 pkg-config

参考&#xff1a; 【Linux 库管理工具】深入解析pkg-config与CMake的集成与应用 - 知乎 正文&#xff1a; 构建工程时&#xff0c;多会依赖于第三方库&#xff0c;这些库在安装到系统中后都会创建一个 .pc 后缀的说明文件&#xff0c;里面包含了库的基本信息&#xff0c;比如…

如何启用Windows电脑的内置Administrator账户

前言 不知道从什么时候开始&#xff0c;新电脑或者新系统开机之后都会出现一个界面让你创建一个账户&#xff0c;但这个账户有可能是本地账户&#xff08;Windows10&#xff09;还有强制你登录微软账户的&#xff08;Windows11&#xff09;。 好像曾经熟悉的电脑Administrator…

Taro +vue3 中 实现 选择城市页面 主要逻辑市 选择了某个城市返回之前的页面

1.需求 当我选中了某个城市 这个页面肯定 从某个页面跳转过来的 此时我先选择了城市 再跳转回去 所以有一个问题就是如何写这个逻辑 2.实现 //当前城市页面 onMounted(() > {const instance: any Taro.getCurrentInstance();if (instance.router.params.url) {sourceUr…

Uncaught (in promise) ReferenceError: require is not defined

在 Vue3 中加载项目路径下的资源图片,起初按照之前 vue 的写法 require 但浏览器却抛出了异常 Uncaught (in promise) ReferenceError: require is not defined 因为 require 采用的 webpack 加载方式,而 vue3 中通过 vite 的方式,两者存在差异,所以才产生了刚开始的一目; vu…

C++中的虚函数

前言 本篇文章讲述C的虚函数 定义 在C语言中&#xff0c;基类将类型相关的函数和派生类不做改变直接继承的函数区分开来。对于有些函数&#xff0c;基类希望派生类各自定义适合自身的版本。那么基类就会将这些函数标记为virtual&#xff0c;这些被标记的函数就是虚函数。 下…

路由的安装顺序

安装前端路由的顺序通常如下&#xff1a; 安装前端框架&#xff1a;选择并安装适合你的项目的前端框架&#xff0c;如React、Vue或Angular等。 创建路由配置文件&#xff1a;在项目根目录下创建一个路由配置文件&#xff0c;比如router.js或routes.js等&#xff0c;用于定义路…

亚马逊国际商品详情 API:获取特定商品详细信息的实践

随着电子商务的飞速发展&#xff0c;亚马逊作为全球最大的在线零售商之一&#xff0c;提供了丰富的商品详情 API&#xff0c;使得第三方开发者能够轻松地获取亚马逊网站上的商品信息。本文将介绍如何使用亚马逊国际商品详情 API&#xff08;Amazon Product Advertising API&…

2024年如何使用WordPress构建克隆Udemy市场

您想创建像 Udemy 这样的学习管理 (LMS) 网站吗&#xff1f;最好的学习管理系统工具LifterLMS将帮助您制作像Udemy市场这样的 LMS 网站。 目录 Udemy市场是什么&#xff1f; 创建 Udemy 克隆所需的几项强制性技术&#xff1a; 步骤 1) 注册您的域名 步骤 2) 获取虚拟主…

springboot git配置文件自动刷新失败问题排查

http://{ip}:{port}/refresh 说明&#xff1a;springBoot版本是1.5.9&#xff0c;接口路径与2.x&#xff0c;不同 路径区别&#xff1a;/refresh VS /actuator/refresh 用postman调用refresh接口刷新git配置&#xff0c;报错如下&#xff0c;没有权限 在服务本地启动&#…

微信私密朋友圈被吐槽有BUG

日前&#xff0c;大量网友在各社交媒体上讨论微信私密朋友圈出现 Bug 的话题&#xff0c;起因是跨年期间一个网友发布了一条”私密朋友圈&#xff0c;但不一会就收到朋友发来的信息&#xff0c;”又偷偷发朋友圈了&#xff1f;“&#xff0c;估计此时网友可能已经”寒毛四起、汗…

D3篇之色卡

学习传送门&#xff1a;Sequential scales | D3 by Observable 1.scaleSequential(domain, interpolator)&#xff08;连续比例尺&#xff09; 是一种在D3.js中用于将一个范围内的连续值射到另一个范围内的连续值的方法。该比例尺通常用于将数值型数据映射到图表元素的属性上…

解锁新世界:小红书笔记详情API的创新应用场景

小红书笔记详情API的创新应用场景包括但不限于以下几个方面&#xff1a; 自动化营销机器人&#xff1a;结合AI和机器学习技术&#xff0c;利用小红书笔记详情API可以开发自动化营销机器人。这些机器人可以自动抓取小红书笔记&#xff0c;分析内容&#xff0c;获取关键信息&…