MySQL 8.0 相对于 MySQL 5.7
MySQL 8.0 相对于 MySQL 5.7,有很多新特性,比如:快速加列、原子 DDL、不可见索引、额外端口、角色管理等。这一节内容,就不讲这些新特性了,只来聊聊最近在工作学习过程中遇到的几处细节上的差异。
1 int 字段类型的差异
比如下面的建表语句,在 5.7 能正常执行:
CREATE TABLE `t1` (`id` int(11) NOT NULL auto_increment,`a` int(11) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
但是在 8.0.17 开始后的版本,执行上面的建表语句,会有如下 warnings:
Integer display width is deprecated and will be removed in a future release.
在上面的建表语句中,int(11) 中的 11 表示最大显示宽度,从 MySQL 8.0.17 开始,int 类型就不推荐使用显示宽度这个属性了。因此 8.0 建议使用单独的 int 来定义整数数据类型,如下:
CREATE TABLE `t1` (`id` int NOT NULL auto_increment,`a` int DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2 创建用户和赋权差异
MySQL 5.7,可以直接使用 grant 命令,用户和赋权都能完成。
grant select on test.* to 'test_user'@'127.0.0.1' identified by 'ddafsduGdsag';
8.0 版本下不 create user 的情况下执行 grant 会报如下错误:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'identified by 'ddafsduGdsag'' at line 1
因此 MySQL 8.0 如果需要创建用户并赋权,必须要先 create user,再执行 grant 命令,操作如下:
create user 'test_user'@'127.0.0.1' identified with mysql_native_password by 'ddafsduGdsag';grant select on test.* to 'test_user'@'127.0.0.1';
3 Block Nested-Loop Join 算法
为了方便下面的实验,我们首先创建测试表并写入数据:
CREATE DATABASE test; /* 创建测试使用的database,名为test */use test; /* 使用test这个database */drop table if exists t1; /* 如果表t1存在则删除表t1 */CREATE TABLE `t1` ( /* 创建表t1 */`id` int(11) NOT NULL auto_increment,`a` int(11) DEFAULT NULL,`b` int(11) DEFAULT NULL,`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMPCOMMENT '记录更新时间',PRIMARY KEY (`id`),KEY `idx_a` (`a`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;drop procedure if exists insert_t1; /* 如果存在存储过程insert_t1,则删除 */delimiter ;;create procedure insert_t1() /* 创建存储过程insert_t1 */begindeclare i int; /* 声明变量i */set i=1; /* 设置i的初始值为1 */while(i<=10000)do /* 对满足i<=10000的值进行while循环 */insert into t1(a,b) values(i, i); /* 写入表t1中a、b两个字段,值都为i当前的值 */set i=i+1; /* 将i加1 */end while;end;;delimiter ; /* 创建批量写入10000条数据到表t1的存储过程insert_t1 */call insert_t1(); /* 运行存储过程insert_t1 */drop table if exists t2; /* 如果表t2存在则删除表t2 */create table t2 like t1; /* 创建表t2,表结构与t1一致 */insert into t2 select * from t1 limit 100; /* 将表t1的前100行数据导入到t2 */
对于下面这条 SQL(注意:两张表的 b 字段都没索引):
select * from t1 inner join t2 on t1.b = t2.b;
在 5.7 版本中的执行计划为:

在 Extra 发现 Using join buffer (Block Nested Loop),这个就说明该关联查询使用的是 Block Nested Loop 算法(后面简称:BNL 算法)。BNL 算法的思想是:把驱动表的数据读入到 join_buffer 中,然后扫描被驱动表,把被驱动表每一行取出来跟 join_buffer 中的数据做循环对比,如果满足 join 条件,则返回结果给客户端。所以 BNL 是一个双重循环,时间复杂度为 O(n^2)如果 join_buffer 放不下的话,那将分成多个块,每个块再进行一次上面的操作。
在 8.0 版本中的执行计划如下:

在 Extra 发现 Using join buffer (hash join),从 MySQL 8.0.20 开始,hash join 替换了 BNL。详情可参考官方文档:https://dev.mysql.com/doc/refman/8.0/en/hash-joins.html。hash join 算法的思想是:先把小一点的表采用 hash 函数,将连接键存放到内存的 hash table 中,然后扫描另外一张表,把另外一张表每一行取出来跟 hash table 中的数据做对比,如果满足 join 条件,则返回结果给客户端。与 BNL 算法相比,hash join 只有一次循环,时间复杂读为 O(n)。当表太大,无法一次性放入内存,就分成多个块,每个块再进行一次上面的操作。对于上面列子,我们可以使用下面的方式查看 hash join 的使用详情:
explain format=tree select * from t1 inner join t2 on t1.b = t2.b\G

默认情况下,只要 MySQL 版本是 8.0.20 及以后的版本,hash join 默认开启的。
对于 hash join 和 BNL 的性能对比,可以参考:https://dev.mysql.com/blog-archive/hash-join-in-mysql-8/。
4 参考文档
Block Nested-Loop Join Algorithm:https://dev.mysql.com/doc/refman/8.0/en/nested-loop-joins.html
Hash Join Optimization:https://dev.mysql.com/doc/refman/8.0/en/hash-joins.html
Hash join in MySQL 8:https://dev.mysql.com/blog-archive/hash-join-in-mysql-8/
MySQL 8.0 相对于 MySQL 5.7的更多相关文章
- MySQL 8.0有什么新功能
https://mysqlserverteam.com/whats-new-in-mysql-8-0-generally-available/ 我们自豪地宣布MySQL 8.0的一般可用性. 现在下载 ...
- RedHat下apache\ftp\mysql 4.0 的安装方法
RedHat下安装这三个服务的方法大同小异 Apache服务: 找到Apache安装包: rpm -ivh httpd-2.0.40-21.i386.rpm 等待安装完成即可 检查安装结果: rpm ...
- MySQL 8.0.12 基于Windows 安装教程(超级详细)
MySQL 8.0.12 基于Windows 安装教程(超级详细) (一步一步来,装不了你找我!) 本教程仅适用Windows系统,如果你原本装了没装上,一定要先删除原本的数据库,执行:mysqld ...
- 在Ubuntu 18.04 安装 MySQL 8.0
在Ubuntu 18.04 安装 MySQL 8.0 ① 登入 mysql 官网,在官网中下载 deb 包,点击该链接,即可下载. https://dev.mysql.com/downloads/re ...
- Python3.7和数据库MySQL 8.0.12 绿色解压 安装教程(一)
首先要安装MySQL 数据库才可以继续安装图形工具SQLyog 第一步:下载解压包>> MYSQL官网地址:https://dev.mysql.com/downloads/file/?id ...
- MySQL 8.0.13 下载安装教程
MySQL是使用最多的数据库,自己电脑上肯定要装一个来多加学习,自己搞不懂的一些东西要多写一些 sql 语句练习. 首先去 mysql 官网下载,地址:https://dev.mysql.com/do ...
- MySQL 并行复制演进及 MySQL 8.0 中基于 WriteSet 的优化
MySQL 8.0 可以说是MySQL发展历史上里程碑式的一个版本,包括了多个重大更新,目前 Generally Available 版本已经已经发布,正式版本即将发布,在此将介绍8.0版本中引入的一 ...
- Mysql 8.0.* zip版本 windows安装
一,MySQL8.0.*zip版本安装步骤. 1,下载 https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.15-winx64.zip 注现 ...
- 【Mysql】- Mysql 8.0正式版新亮点
MySQL 8.0 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 注意:从 MySQL 5.7 升级到 MySQL 8 ...
- MySQL 8.0 正式版 8.0.11 发布:比 MySQL 5.7 快 2 倍
ySQL 8.0 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 注意:从 MySQL 5.7 升级到 MySQL 8. ...
随机推荐
- C# Webapi Filter 过滤器 - 生命周期钩子函数 - Exception Filter 基础
什么是Filter ? 1. 切面编程机制,在 ASP.NET Core 特定的位置执行我们自定义的代码: 2. ASP.NET Core 中的Filter五种类型,Authorization ,fi ...
- typeOrm 教程 创建链接数据库
实体 User : import { Entity, PrimaryGeneratedColumn, Column } from "typeorm" @Entity() expor ...
- yarn : 无法加载文件 C:\Users\zhulo\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?Li nkID=135170 中的 about_Execution_Policies。 所在位置 行:1 字符: 1 + yarn serve
powershell的执行策略问题: 解决办法: 管理员身份打开powershell 输入 set-ExecutionPolicy RemoteSigned 然后选择 a or Y :
- 强化学习笔记之【SAC算法】
强化学习笔记之[SAC算法] 前言: 本文为强化学习笔记第四篇,第一篇讲的是Q-learning和DQN,第二篇DDPG,第三篇TD3 TD3比DDPG少了一个target_actor网络,其它地方有 ...
- NJU ICS2024 PA 作业心得(一)
NJU ICS2024 PA 作业心得(一) 由于自己并不是NJU 2024的学生,因此"堂而皇之"的把这份心得发在了网上,并且只是仅供非以此课程作为自己当前学年保研课的同学参考. ...
- 云原生周刊:Knative 1.15 版本发布|2024.8.5
开源项目推荐 helm-secrets helm-secrets 是一个 Helm 插件,用于动态解密加密的 Helm 值文件. Tofu Controller Tofu Controller(以前称 ...
- 马斯克对于CEO职能,发挥人才天赋,激励人才的想法
Time Interview with Elon Musk, 29 September 2011. Content 1 Have people do be focused on doing usefu ...
- 一文彻底弄懂MySQL的优化
在企业级 Web 开发中,MySQL 优化是至关重要的,它直接影响系统的响应速度.可扩展性和整体性能.下面从不同角度,列出详细的 MySQL 优化技巧,涵盖查询优化.索引设计.表结构设计.配置调整等方 ...
- glibc 内存分配与释放机制详解
作者:来自 vivo 互联网存储团队- Wang Yuzhi 本文以一次线上故障为基础介绍了使用 glibc 进行内存管理可能碰到问题,进而对库中内存分配与释放机制进行分析,最后提供了相应问题的解决方 ...
- 基于Java+SpringBoot+Mysql实现的古诗词平台功能设计与实现四
一.前言介绍: 1.1 项目摘要 随着信息技术的迅猛发展和数字化时代的到来,传统文化与现代科技的融合已成为一种趋势.古诗词作为中华民族的文化瑰宝,具有深厚的历史底蕴和独特的艺术魅力.然而,在现代社会中 ...