MySQL 8.0中新增的功能(四)

数据类型支持

MySQL现在支持在数据类型规范中将表达式用作默认值。这包括可以为以前无法分配默认值的BLOB、TEXT、GEOMETRY和JSON数据类型设置表达式作为默认值。

优化器

以下是新增的优化器改进:

  • MySQL现在支持不可见索引。不可见索引在优化器中根本不被使用,但在其他方面仍然正常维护。索引默认是可见的。不可见索引使得可以测试在查询性能上移除索引的影响,而不会造成不可逆的破坏性改变,如果发现索引是必需的,则需要撤销这些改变。
  • MySQL现在支持降序索引:在索引定义中使用DESC不再被忽略,而是导致键值按降序存储。以前,索引可以按相反顺序扫描,但会导致性能损失。降序索引可以按正向顺序扫描,这更高效。降序索引还使得优化器可以在多列索引上使用多种扫描顺序,其中某些列以升序排序,而其他列以降序排序。
  • MySQL现在支持创建函数索引关键部分,可以索引表达式的值而不是列的值。函数索引关键部分可以对无法进行索引的值进行索引,例如JSON值。
  • 在MySQL 8.0.14及更高版本中,由常量文字表达式引起的无关紧要的WHERE条件在准备阶段被删除,而不是在优化阶段后面被删除。在过程的早期移除条件使得能够简化具有无关紧要条件的外连接查询的连接操作,例如下面的查询条件:
    SELECT * FROM t1 LEFT JOIN t2 ON condition_1 WHERE condition_2 OR 0 = 1
    

    在准备阶段,优化器现在能够看到0 = 1始终为false,因此可以将OR 0 = 1这部分判定为多余,并将其移除,只留下以下内容:

    SELECT * FROM t1 LEFT JOIN t2 ON condition_1 where condition_2

    现在,优化器可以将查询重写为内连接,如下所示:

    SELECT * FROM t1 LEFT JOIN t2 WHERE condition_1 AND condition_2
  • 在MySQL 8.0.16及更高版本中,MySQL可以在优化时使用常量折叠来处理列与常量值之间的比较,其中常量值超出了列的类型的范围或位于范围边界上,而不是在执行时为每一行进行操作。例如,给定一个具有TINYINT UNSIGNED列c的表t,优化器可以将条件例如WHERE c < 256重写为WHERE 1(并完全优化掉该条件),或将WHERE c >= 255重写为WHERE c = 255。
  • 从MySQL 8.0.16开始,与IN子查询一起使用的半连接优化现在也可以应用于EXISTS子查询。此外,优化器现在会解除子查询所附带的WHERE条件中的无关紧要的关联相等谓词,使其能够类似于IN子查询中的表达式进行处理;这适用于EXISTS和IN子查询。
  • 从MySQL 8.0.17开始,服务器会在上下文化阶段内部将任何不完整的SQL谓词(即形式为WHERE value的谓词,其中value是列名或常量表达式,而且没有使用比较运算符)重写为WHERE value <> 0,以便查询解析器、查询优化器和查询执行器只需要处理完整的谓词。

    这个变化的一个显著影响是,在布尔值上,EXPLAIN输出现在显示true和false,而不是1和0。

    这个变化的另一个影响是,在SQL布尔上下文中评估JSON值将隐式与JSON整数0进行比较。考虑下面所示的创建和填充表的例子:

    mysql> CREATE TABLE test (id INT, col JSON);
    mysql> INSERT INTO test VALUES (1, '{"val":true}'), (2, '{"val":false}');
     在之前的版本中,服务器在SQL布尔上下文中将提取的true或false值尝试转换为SQL布尔值,如下面使用IS TRUE的查询所示:
    mysql> SELECT id, col, col->"$.val" FROM test WHERE col->"$.val" IS TRUE;
    +------+---------------+--------------+
    | id   | col           | col->"$.val" |
    +------+---------------+--------------+
    | 1    | {"val": true} | true         |
    +------+---------------+--------------+
    

    在MySQL 8.0.17及更高版本中,将提取的值隐式与JSON整数0进行比较会得到不同的结果:

    mysql> SELECT id, col, col->"$.val" FROM test WHERE col->"$.val" IS TRUE;
    +------+----------------+--------------+
    | id   | col            | col->"$.val" |
    +------+----------------+--------------+
    | 1    | {"val": true}  | true         |
    | 2    | {"val": false} | false        |   
    +------+----------------+--------------+

    从MySQL 8.0.21开始,您可以在执行测试之前使用JSON_VALUE()函数对提取的值进行类型转换,示例如下:

    mysql> SELECT id, col, col->"$.val" FROM test-> WHERE JSON_VALUE(col, "$.val" RETURNING UNSIGNED) IS TRUE;
    +------+---------------+--------------+
    | id   | col           | col->"$.val" |
    +------+---------------+--------------+
    | 1    | {"val": true} | true         |
    +------+---------------+--------------+

    从MySQL 8.0.21开始,服务器提供了一个警告:“在SQL布尔上下文中评估JSON值会隐式与JSON整数0进行比较;如果这不是您想要的,请考虑使用JSON_VALUE RETURNING将JSON转换为SQL数值类型,在SQL布尔上下文中以这种方式比较提取的值”。

  • 在MySQL 8.0.17及更高版本中,拥有NOT IN (子查询)或NOT EXISTS (子查询)的WHERE条件会在内部转换为反连接。反连接返回表中所有行,其中没有与它连接的表中的行与连接条件匹配。这将消除子查询,可以加快查询执行速度,因为子查询的表现在在顶层处理。

    这类似于外连接的IS NULL (Not exists)优化,并且重新使用了这个优化。

  • 从MySQL 8.0.21开始,单表UPDATE或DELETE语句现在可以在许多情况下使用半连接转换或子查询结果存储。适用于以下形式的语句:

    • UPDATE t1 SET t1.a=value WHERE t1.a IN (SELECT t2.a FROM t2)
    • DELETE FROM t1 WHERE t1.a IN (SELECT t2.a FROM t2)

    单表UPDATE或DELETE必须满足以下条件才能执行这种转换:

    • UPDATE或DELETE语句使用具有[NOT] IN或[NOT] EXISTS谓词的子查询。
    • 语句没有ORDER BY子句,也没有LIMIT子句。(多表版本的UPDATE和DELETE不支持ORDER BY或LIMIT。)
    • 目标表不支持读取前写入删除(仅适用于NDB表)。
    • 基于子查询中包含的任何提示和optimizer_switch的值,允许使用半连接或子查询结果存储。

    当半连接优化用于合格的单表DELETE或UPDATE时,在优化器跟踪中可见:对于多表语句,跟踪中有一个join_optimization对象,而单表语句则没有。这种转换还可在EXPLAIN FORMAT=TREE或EXPLAIN ANALYZE的输出中看到:单表语句显示为“<not executable by iterator executor>”,而多表语句报告了一个完整的计划。

    从MySQL 8.0.21开始,使用InnoDB表的多表UPDATE语句支持半一致性读,适用于比REPEATABLE READ更弱的事务隔离级别。

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

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

相关文章

vmlinux, vmlinux.bin, bzImage; cmake的find_package(Clang)新增了哪些变量( 比较两次记录的所有变量差异)

vmlinux, vmlinux.bin, bzImage cd /bal/linux-stable/ file vmlinux #vmlinux: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, BuildID[sha1]b99bbd9dda1ec2751da246d4a7ae4e6fcf7d789b, not stripped #文件大小 20MB, 19940148Bfile arc…

[ROS2 Foxy]#1.3 安装使用 turtlesim

官网教程: https://docs.ros.org/en/foxy/Tutorials/Turtlesim/Introducing-Turtlesim.html 1.turtlesim安装和使用 turtlesim是一个轻量级的模拟程序,用来学习ROS2 .通过turtlesim来介绍ROS2在一个基础的水平上都要做了那些事,以此让我们了解将来在真的 robot或者模拟器上使用…

【AI视野·今日Sound 声学论文速览 第四十期】Wed, 3 Jan 2024

AI视野今日CS.Sound 声学论文速览 Wed, 3 Jan 2024 Totally 4 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers Auffusion: Leveraging the Power of Diffusion and Large Language Models for Text-to-Audio Generation Authors Jinlong Xue, Yayue De…

[VUE]5-TypeScript

目录 1 TypeScript 介绍2、安装3、快速上手4、TypeScript 常用类型4.1 类型标注的位置4.2 字符串、数字、布尔类型4.3 字面量类型4.4 ⭐interface 类型4.5 class 类型 ​&#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;…

Linux第10步_通过终端挂载和卸载U盘

学习完“通过终端查看U盘文件”后&#xff0c;我们需要接着学习“通过终端挂载和卸载U盘”。主要是挂载U盘&#xff0c;它的用处很大&#xff0c;目的是通过命令来访问U盘。由于U盘的名字有很多种&#xff0c;为了便于访问&#xff0c;我们把将U盘的第一分区挂载到udisk目录下&…

软件测试|深入解析Docker Run命令:创建和启动容器的完全指南

简介 Docker是一种流行的容器化平台&#xff0c;用于构建、分发和运行应用程序。其中一个最基本且重要的Docker命令是docker run&#xff0c;用于创建和启动容器。本文将详细解析docker run命令的用途、参数和示例&#xff0c;帮助您全面掌握创建和启动容器的过程。 docker r…

【LVGL】不同类型输入设备驱动接口的实现

官方提供了lv_port_indev_template.c文件&#xff0c;用以实现触摸屏、鼠标、键盘、编码器、按钮五种输入设备的接口程序。使用相应的设备&#xff0c;就需要去掉接口部分的注释&#xff0c;填充相应的初始化函数和读取函数。 LVGL支持多设备输入&#xff0c;只需要在lv_port_i…

Linux第13步_安装“vim编辑器”及应用介绍

学习“磁盘重新分区”后&#xff0c;嵌入式Linux系统环境搭建进入安装“vim编辑器”这个环节。vim编辑器可以用来修改文件&#xff0c;在后期使用中&#xff0c;会经常用到。 1、安装“vim编辑器” 输入“sudo apt-get install vim回车”&#xff0c;就可以执行安装“vim编辑…

thinkphp学习03-url访问模式

多应用&#xff1a;http://serverName/index.php/应用/控制器/操作/参数/值…&#xff1b;单应用&#xff1a;http://serverName/index.php/控制器/操作/参数/值…&#xff1b; http://localhost:8506/index.php Contoller下新建Test.php <?php namespace app\controlle…

new和delete表达式的工作步骤

new表达式工作步骤 调用一个operator new库函数开辟未类型化的空间 void *operator new(size_t); 在为类型化的空间上调用构造函数&#xff0c;初始化对象的成员 返回相应类型的指针 delete表达式工作步骤 调用相应类型的析构函数,但析构函数并不能删除对象所在的空间&…

黑马程序员Java项目实战《瑞吉外卖》,轻松掌握springboot + mybatis plus开发核心技术的真java实战项目——第三部分

黑马程序员Java项目实战《瑞吉外卖》&#xff0c;轻松掌握springboot mybatis plus开发核心技术的真java实战项目——第三部分 1. 菜品管理的业务功能1.1 文件的上传和下载&#x1f647;‍♂️1.2 新增菜品1.3 接收页面提交的数据&#x1f647;‍♂️&#xff08;涉及两张表&a…

Long类型转换精度丢失问题解决

问题: 启动前端项目 页面传递的ID 和数据库保存的ID不一致 原因&#xff1a;给前端返回的id为long类型&#xff0c;在转换json传递到前端以后精度丢失&#xff0c;所以前端给我们的id也是丢失精度的id,不能查询数据。 因为js数字类型最大长度为16位&#xff0c;而java的long类…

spring动态控制定时任务

在spring框架中&#xff0c;对于简单的定时任务&#xff0c;可以使用 Scheduled 注解实现&#xff0c;在实际项目中&#xff0c;经常需要动态的控制定时任务&#xff0c;比如通过接口增加、启动、停止、删除定时任务&#xff0c;动态的改变定时任务的执行时间等。 我们可以通过…

android系列-init 挂载文件系统

1.init 挂载文件系统 //android10\system\core\init\main.cppint main(int argc, char** argv) {return FirstStageMain(argc, argv); } //android10\system\core\init\first_stage_init.cppint FirstStageMain(int argc, char** argv) {CHECKCALL(mount("tmpfs",…

dnSpy调试Web应用程序

文章目录 前言一、dnSpy是什么&#xff1f;二、如何使用dnSpy三、如何调试Web应用程序四、下载总结 前言 dnSpy是一个.NET程序集调试器和编辑器&#xff0c;主要用于调试和编辑没有源码的.NET程序集。 一、dnSpy是什么&#xff1f; dnSpy是一个.NET程序集调试器和编辑器&#…

IDEA 控制台中文乱码问题解决方法(UTF-8 编码)

设置 IDEA 编码格式 1&#xff1a;打开 IntelliJ IDEA>File>Setting>Editor>File Encodings&#xff0c;将 Global Encoding、Project Encoding、Default encodeing for properties files 这三项都设置成 UTF-8 2&#xff1a;将 vm option 参数改为&#xff1a; -…

Linux Capabilities 基础概念与基本使用

目录 1. Linux capabilities 是什么&#xff1f; 2. capabilities 的赋予和继承 线程的 capabilities Permitted* 允许 Effective* 有效 Inheritable* 遗传 Bounding&#xff08;集合&#xff09; Ambient 文件的 capabilities Permitted Inheritable Effective 3…

链表

目录 单链表 双链表 单链表 题目如下&#xff1a;模拟一个单链表&#xff0c;实现插入删除操作 解题代码 #include <iostream>using namespace std;const int N 100010;// head 表示头结点的下标 // e[i] 表示节点i的值 // ne[i] 表示节点i的next指针是多少 // idx …

墨墨智库正式上线:开启您的AI智慧之旅

在这个由数据驱动的时代&#xff0c;AI技术正迅速改变我们的工作和生活方式。有没有想过一个平台可以为您提供所有AI相关资源的便捷访问&#xff1f;这就是「墨墨智库」的使命。我们非常高兴地宣布&#xff0c;经过精心准备和期待&#xff0c;「墨墨智库」现已正式上线&#xf…

图像解析力测试

什么是图像解析力测试 图像解析力测试是衡量成像系统性能的关键指标之一,它决定了摄像头捕捉到的图像细节和清晰度。目前主流的图像解析力测试方法主要有TV line检测、MTF检测和SFR检测。 TV line检测主要用于主观测试,通过观察图像中的线条来评估解析力。然而,这种方法缺乏…