MySQL 8.0中新增的功能(七)

2024-01-09

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=5
 ON DUPLICATE KEY UPDATE a=VALUES(a)+VALUES(b);

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

INSERT INTO t SET a=9,b=5 AS new
 ON DUPLICATE KEY UPDATE a=new.a+new.b;
INSERT INTO t VALUES(9,5) AS new
 ON 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 t1
 WHERE JSON_VALUE(j, '$.id' RETURNING UNSIGNED) = 123;

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 8.0中新增的功能(七) 的相关文章

随机推荐

  • Sage运行pwntools库脚本异常解决:OSError: Int or String expected

    需要和Oracle交互的密码学脚本一般都需要借助pwn库的帮助 今天切换了python版本后 出现了一个异常 OSError Int or String expected 详细异常见文章 查阅一下源码后简单的解决了这个问题 在此分享一下 文
  • 解锁数据之门Roxlabs全球住宅IP赋能海外爬虫与学术研究

    11 20云账房测试一面凉经 华为开奖啦 关于邮储的一些情况 维信金科一面 二面 hr面 我的导师太好了 上海维信金科 技术面试一 Java后端开发岗记录贴 维信金科正式批面经 软件技术领域就业大纲 1 公司分类 你裁掉这个应届生用了多长时
  • TypeScript 和 jsdom 库创建爬虫程序示例

    TypeScript 简介 TypeScript 是一种由微软开发的自由和开源的编程语言 它是 JavaScript 的一个超集 可以编译生成纯 JavaScript 代码 TypeScript 增加了可选的静态类型和针对对象的编程功能 使
  • 在职状态下继续学习的心得体会

    本来平时记录的都是一些技术点的学习和使用 今天打算记录一下学习方法 当然不一定适合所有人 因人而异 仅供参考 学习这件事 对于IT行业来说 真的是活到老学到老 技术的更新迭代速度非常快 而且总是有那么一些公司特别的卷 没办法 改变不了外因
  • 模型训练 -- 数据集的获取(如何筛选想要数据)

    目录 一 前言 二 数据平台 三 数据处理 1 MaixHub平台使用 2 ZIP格式整理与上传平台 3 数据处理 使用平台删除标注 四 参考 一 前言 对于图像数据集的获取 一直是一个麻烦点 自己不想去标注数据 太繁琐了 所以 我分享出一
  • 在线智能抠图软件有哪些?证件照背景颜色更换不求人

    2024年上半年全国计算机等级考试 NCRE 报名开始啦 不出意外 这次报名仍然是需要提交证件照 具体要求如下 本人近期正面免冠 白色背景 彩色证件照 不得使用生活照 美颜照 最小像素高宽为192x144 最小成像区高宽为48mmx33mm
  • 大模型笔记【2】 LLM in Flash

    Apple最近发表了一篇文章 可以在iphone MAC 上运行大模型 LLM in a flash Efficient Large Language Model Inference with Limited Memory 主要解决的问题是
  • ros2 基础学习 15- URDF:机器人建模方法

    URDF 机器人建模方法 ROS是机器人操作系统 当然要给机器人使用啦 不过在使用之前 还得让ROS认识下我们使用的机器人 如何把一个机器人介绍给ROS呢 为此 ROS专门提供了一种机器人建模方法 URDF Unified Robot De
  • 解锁数据之门Roxlabs全球住宅IP赋能海外爬虫与学术研究

    11 20云账房测试一面凉经 华为开奖啦 关于邮储的一些情况 维信金科一面 二面 hr面 我的导师太好了 上海维信金科 技术面试一 Java后端开发岗记录贴 维信金科正式批面经 软件技术领域就业大纲 1 公司分类 你裁掉这个应届生用了多长时
  • MySQL 8.0中新增的功能(五)

    改进哈希连接性能 MySQL 8 0 23重新实现了用于哈希连接的哈希表 从而改进了哈希连接的性能 这项工作包括修复了一个问题 Bug 31516149 Bug 99933 在这个问题中 用于连接缓冲区 join buffer size 的
  • 【设计模式之美】 SOLID 原则之五:依赖反转原则:将代码执行流程交给框架

    文章目录 一 控制反转 IOC 二 依赖注入 DI 三 依赖注入框架 DI Framework 四 依赖反转原则 DIP 一 控制反转 IOC 通过一个例子来看一下 什么是控制反转 public class UserServiceTest
  • MySQL 8.0中新增的功能(六)

    配置 MySQL中主机名的最大允许长度已经从之前的60个字符提高到255个ASCII字符 这适用于数据字典中与主机名相关的列 mysql系统模式 性能模式 INFORMATION SCHEMA和sys模式 CHANGE MASTER TO语
  • 论文查重部分算不算重复率呢

    大家好 今天来聊聊论文查重部分算不算重复率呢 希望能给大家提供一点参考 以下是针对论文重复率高的情况 提供一些修改建议和技巧 可以借助此类工具 论文查重部分算不算重复率呢 在论文查重过程中 查重部分是否计入重复率是一个关键问题 本文将从七个
  • python安装教程(2020最新),python安装视频教程

    大家好 小编来为大家解答以下问题 python安装教程 2020最新 python安装视频教程 现在让我们一起来看看吧 python安装是学习pyhon第一步 很多刚入门小白不清楚如何安装python 今天我来带大家完成python安装与配
  • 请求各位大佬帮助,请问qt项目能调用卷积神经网络进行训练模型嘛?

    qt项目想调MobileNetV3网络进行训练模型 得到权重文件 能实现嘛
  • ros2 基础学习14-- Launch:多节点启动与配置脚本

    到目前为止 每当我们运行一个ROS节点 都需要打开一个新的终端运行一个命令 机器人系统中节点很多 每次都这样启动好麻烦呀 有没有一种方式可以一次性启动所有节点呢 答案当然是肯定的 那就是Launch启动文件 它是ROS系统中多节点启动与配置
  • 【数位dp】【动态规划】C++算法:233.数字 1 的个数

    作者推荐 动态规划 C 算法312 戳气球 本文涉及的基础知识点 动态规划 数位dp LeetCode 233数字 1 的个数 给定一个整数 n 计算所有小于等于 n 的非负整数中数字 1 出现的个数 示例 1 输入 n 13 输出 6 示
  • 软件测试开发/全日制/测试管理丨测试左移体系

    对于 测试左移 这一术语 通常是指在软件开发过程中 测试活动的介入时间往项目生命周期的早期移动 这个概念强调在需求 设计和编码阶段就开始考虑测试 以提高软件的质量和减少后期修复缺陷的成本 以下是测试左移体系的一些关键方面 1 早期测试活动
  • Qt Creator 常用快捷键

    Qt Creator 常用快捷键一览表 功能描述 快捷键 多行注释模式 Ctrl 激活欢迎模式 Ctrl 1 激活编辑模式 Ctrl 2 激活调试模式 Ctrl 3 激活项目模式 Ctrl 4
  • MySQL 8.0中新增的功能(七)

    EXPLAIN ANALYZE 语句 在MySQL 8 0 18中引入了一种新形式的EXPLAIN语句 即EXPLAIN ANALYZE 它提供了关于SELECT语句执行的扩展信息 以TREE格式显示查询过程中每个迭代器的执行计划 并可以比