mysql8.0的新特性
https://www.cnblogs.com/kevingrace/p/10482469.html
MySQL 8 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能!
一. Mysql8.0版本相比之前版本的一些特性
1) 默认编码utf8
默认编码使用utf8mb4, utf8mb4编码是utf8编码的超集,兼容utf8,并且能存储4字节的表情字符历史,MySQL数据库的 "utf8"并不是真正概念里的 UTF-8。MySQL中的"utf8"编码只支持最大3字节每字符。真正的大家正在使用的UTF-8编码是应该能支持4字节每个字符。MySQL的开发者没有修复这个bug。他们在2010年增加了一个变通的方法:一个新的字符集"utf8mb4"另外,utf-32编码固定使用4字节,32bit存储相比utf8浪费空间。
2) 降序索引
在之前的版本中可以创建,但是实际创建的还是升序索引
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
 | 
mysql> create table t1(id1 int,id2 int,key(id1,id2 desc));Query OK, 0 rows affected (0.10 sec)  mysql> show create table t1 \G;*************************** 1. row ***************************       Table: t1Create Table: CREATE TABLE `t1` (  `id1` int(11) DEFAULT NULL,  `id2` int(11) DEFAULT NULL,  KEY `id1` (`id1`,`id2` DESC)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci1 row in set (0.00 sec)  ERROR:No query specified | 
另外,由于降序索引的引入,MySQL 8.0再也不会对group by操作进行隐式排序
3) 隐藏索引
隐藏索引的特性对于性能调试非常有用。当一个索引隐藏时,它不会被查询优化器所使用。也就是说,我们可以隐藏一个索引,然后观察对数据库的影响。如果数据库性能有所下降,就说明这个索引是有用的,于是将其“恢复显示”即可;如果数据库性能看不出变化,说明这个索引是多余的,可以删掉了.
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
 | 
mysql> create index idx2 on t1(id1);Query OK, 0 rows affected (0.35 sec)Records: 0  Duplicates: 0  Warnings: 0  mysql> alter table t1 alter index idx2 invisible;Query OK, 0 rows affected (0.09 sec)Records: 0  Duplicates: 0  Warnings: 0  mysql> show index from t1 where key_name='idx2' \G;*************************** 1. row ***************************        Table: t1   Non_unique: 1     Key_name: idx2 Seq_in_index: 1  Column_name: id1    Collation: A  Cardinality: 0     Sub_part: NULL       Packed: NULL         Null: YES   Index_type: BTREE      Comment:Index_comment:      Visible: NO1 row in set (0.01 sec)  ERROR:No query specified | 
当索引被隐藏时,它的内容仍然是和正常索引一样实时更新的,此特性是专门为优化调试使用。如果长期隐藏一个索引,那还不如干脆删掉,因为毕竟索引存在会影响插入、更新和删除的性能.
4) 设置持久化
在oracle中可以使用scope设置参数确定是否到spfile, 现在mysql8.0也可以放在文件中了,使用方法:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
 | 
mysql> show variables like 'max_connects';Empty set (0.07 sec)  mysql> show variables like 'max_connections';+-----------------+-------+| Variable_name   | Value |+-----------------+-------+| max_connections | 500   |+-----------------+-------+1 row in set (0.01 sec)  mysql> set persist max_connections=1000;Query OK, 0 rows affected (0.00 sec)  mysql> show variables like 'max_connections';+-----------------+-------+| Variable_name   | Value |+-----------------+-------+| max_connections | 1000  |+-----------------+-------+1 row in set (0.01 sec) | 
可以查看在数据目录datadir中的一个mysqld-auto.cnf文件中保存了设置,下次启动时候将用此配置覆盖默认配置参数
{ "Version" : 1 , "mysql_server" : { "max_connections" : { "Value" : "1000" , "Metadata" : { "Timestamp" : 1540437420567571 , "User" : "root" , "Host" : "" } } } }
5) 通用表表达式(Common Table Expressions)
也可以称为虚拟视图,大大简化复杂查询
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
 | 
mysql> WITH    ->  t1 AS (SELECT * FROM t1),    ->  t2 AS (SELECT * FROM t1)    -> SELECT t1.*, t2.*    -> FROM t1, t2;+------+------+------+------+| id1  | id2  | id1  | id2  |+------+------+------+------+|    1 |    2 |    1 |    2 |+------+------+------+------+1 row in set (0.00 sec) | 
6) 窗口函数(Window Functions)
MySQL 被吐槽最多的特性之一就是缺少 rank() 函数,当需要在查询当中实现排名时,必须手写 @ 变量。但是从 8.0 开始,MySQL 新增了一个叫窗口函数的概念,它可以用来实现若干新的查询方式
说明,窗口可以单独创建。
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
 | 
mysql> create table tbl2(name varchar(10),amount int);Query OK, 0 rows affected (0.16 sec)  mysql> insert into tbl2 values('usa',100),('china',101),('japan',103),('russian',99);Query OK, 4 rows affected (0.13 sec)Records: 4  Duplicates: 0  Warnings: 0  mysql> select t1.*,rank() over w as 'rank' from tbl2 as t1 window w as (order by amount);+---------+--------+------+| name    | amount | rank |+---------+--------+------+| russian |     99 |    1 || usa     |    100 |    2 || china   |    101 |    3 || japan   |    103 |    4 |+---------+--------+------+4 rows in set (0.00 sec)  mysql> select t1.*,rank() over() as 'rank' from tbl2 as t1;+---------+--------+------+| name    | amount | rank |+---------+--------+------+| usa     |    100 |    1 || china   |    101 |    1 || japan   |    103 |    1 || russian |     99 |    1 |+---------+--------+------+4 rows in set (0.00 sec)  mysql> select t1.*,rank() over(order by amount) as 'rank' from tbl2 as t1;+---------+--------+------+| name    | amount | rank |+---------+--------+------+| russian |     99 |    1 || usa     |    100 |    2 || china   |    101 |    3 || japan   |    103 |    4 |+---------+--------+------+4 rows in set (0.00 sec)  mysql> select t1.*,sum() over() as 'rank' from tbl2 as t1;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 ') over() as 'rank' from tbl2 as t1' at line 1mysql> select t1.*,sum(amount) over() as 'sum' from tbl2 as t1;+---------+--------+------+| name    | amount | sum  |+---------+--------+------+| usa     |    100 |  403 || china   |    101 |  403 || japan   |    103 |  403 || russian |     99 |  403 |+---------+--------+------+4 rows in set (0.00 sec) | 
7) 安全性
对 OpenSSL 的改进、新的默认身份验证、SQL 角色、密码强度、授权。MySQL现在维护关于密码历史的信息,允许对以前密码的重用进行限制
比如常见的一个连接错误,参考:https://blog.csdn.net/jc_benben/article/details/80652897
8) 增加JSON (json enhancements)AND OpenGIS spatial types
mysql提供了很多json相关的函数和API接口,添加了基于路径查询参数从 JSON 字段中抽取数据的 JSON_EXTRACT() 函数,以及用于将数据分别组合到 JSON 数组和对象中的 JSON_ARRAYAGG() 和 JSON_OBJECTAGG() 聚合函数
9) 原子数据定义语句(原子DDL)(Atomic Data Definition Statements (Atomic DDL))
10) 资源管理(Resource management)
MySQL现在支持资源组的创建和管理,并允许将服务器内运行的线程分配给特定组,以便线程根据组可用的资源执行。组属性可以控制其资源,以启用或限制组中线程的资源消耗
11) Data dictionary
MySQL现在包含一个事务数据字典,用于存储有关数据库对象的信息,In previous MySQL releases, dictionary data was stored in metadata files and nontransactional tables
比如myisam和innodb表定义frm文件等.
12) innodb的增强
1  每次值更改时,当前最大自动增量计数器值将写入重做日志,并保存到每个检查点上的引擎专用系统表中。这些更改使当前最大自动增量计数器值在服务器重新启动时保持不变。
2 遇到索引树损坏时, InnoDB将损坏标志写入重做日志,这会使损坏标志崩溃安全。InnoDB还将内存中损坏标志数据写入每个检查点上的引擎专用系统表。在恢复期间, InnoDB从两个位置读取损坏标志并在将内存表和索引对象标记为损坏之前合并结果。
3 InnoDB 分布式缓存插件支持多个get操作(读取在一个单一的多键/值对分布式缓存查询)和范围查询;
4 新的动态配置选项 innodb_deadlock_detect可用于禁用死锁检测。在高并发系统上,当许多线程等待同一个锁时,死锁检测会导致速度减慢。有时,禁用死锁检测可能更有效,并且在innodb_lock_wait_timeout发生死锁时依赖于事务回滚的设置。
5 INFORMATION_SCHEMA.INNODB_CACHED_INDEXES 表报告InnoDB每个索引缓冲池中缓存的索引页数 。
6 InnoDB现在,在共享临时表空间中创建临时表ibtmp1。
7 InnoDB 表空间加密功能支持重做日志的加密和撤消日志数据;
8 InnoDB支持 NOWAIT和SKIP LOCKED选项SELECT ... FOR SHARE以及SELECT ... FOR UPDATE锁定读取语句。 NOWAIT如果请求的行被另一个事务锁定,则会立即返回该语句。SKIP LOCKED从结果集中删除锁定的行SELECT ... FOR SHARE替换 SELECT ... LOCK IN SHARE MODE,但LOCK IN SHARE MODE仍可用于向后兼容;
9 支持ADD PARTITION,DROP PARTITION,COALESCE PARTITION,REORGANIZE PARTITION,和REBUILD PARTITION ALTER TABLE选项;
10 InnoDB存储引擎现在使用MySQL的数据字典,而不是它自己的存储引擎特定的数据字典;
11 mysql系统表和数据字典表现在在MySQL数据目录中InnoDB命名的单个表空间文件创建mysql.ibd。以前,这些表是InnoDB在mysql数据库目录中的各个表空间文件中创建的;
mysql8.0的新特性的更多相关文章
- MySQL8.0.16新特性:The Communication Protocol In Group Replication
		
MGR优雅升级到MySQL8.0.16 传统的升级手段之一,5.7 MGR集群与8.0 MGR集群进行数据传输,程序切换新集群后测试是否正常. 如果不正常,要么将新集群的新增数据同步回旧集群,要么就舍 ...
 - mysql8.0发布新特性
		
2018年4月21日 14:36:42 https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-11.html#mysqld-8-0-11-b ...
 - MySQL-8.0.x 新特性之索引页合并
		
[背景] 索引的重要是在些不表.在这里我想说的另一个问题:索引和数据一样在innodb中都是以page的形式来组织的,那么问题就来了. 比如果说索引 ix_person_name 的内容只要8个页面就 ...
 - MySQL8.0哪些新特性你最期待
		
1.数据字典全部采用InnoDB引擎存储,支持DDL原子性.crash safe,metadata管理更完善 2.快速在线加新列(腾讯互娱DBA团队贡献) 3.并行redo log,并提升redo l ...
 - php5.3到php7.0.x新特性介绍
		
<?php /*php5.3*/ echo '<hr>'; const MYTT = 'aaa'; #print_r(get_defined_constants()); /* 5.4 ...
 - paip.php 5.0 5.3 5.4  5.5 -6.0的新特性总结与比较
		
paip.php 5.0 5.3 5.4 5.5 -6.0的新特性总结与比较 PHP5的新特性 2 · 对象的参照过渡是默认的(default) 3 · 引入访问属性的限制 3 · 引入访问方法的限 ...
 - NodeJS 框架 Express 从 3.0升级至4.0的新特性
		
NodeJS 框架 Express 从 3.0升级至4.0的新特性 [原文地址:√https://scotch.io/bar-talk/expressjs-4-0-new-features-and-u ...
 - 相比于python2.6,python3.0的新特性。
		
这篇文章主要介绍了相比于python2.6,python3.0的新特性.更详细的介绍请参见python3.0的文档. Common Stumbling Blocks 本段简单的列出容易使人出错的变动. ...
 - MySQL 8.0 InnoDB新特性
		
MySQL 8.0 InnoDB新特性 1.数据字典全部采用InnoDB引擎存储,支持DDL原子性.crash safe,metadata管理更完善 2.快速在线加新列(腾讯互娱DBA团队贡献) 3. ...
 
随机推荐
- LNMP  1.6 常见的502问题解决
			
在nginx上跑discuz,先修改配置文件 cd /usr/local/nginx/conf/vhosts/ vim test.conf server { listen ; server_name ...
 - BitmapCutter.Core 引用步骤
			
1 将BitmapCutter.Core项目或者dll引用到需要的项目底下. 2 前台页面 <img id="imgPreview1" title="点击上传图片& ...
 - jQuery-图片的放大镜显示效果(需要大小图)
			
1.default.aspx <%@ Page Language=.2em; height:.1em; text-align:center; font-size:128px;} .zxx_ ...
 - go语言的源码文件的分类及含义
			
Go源码文件:名称以.go为后缀,内容以Go语言代码组织的文件 多个Go源码文件是需要用代码包组织起来的 源码文件分为三类:命令源码文件.库源码文件(go语言程序) 测试源码文件(辅助源码文件) 命令 ...
 - cakephp增删改查
			
增 $this->create(); $ret = $this->save($data); 删 $ret = $this->deleteAll(array('user_id'=> ...
 - 树莓派研究笔记(10)-- Retropie 模拟器
			
前面介绍过lakka模拟器,小巧,轻便,支持中文.其实最著名的游戏系统还是要属于Retropie啊.虽然笨重了一点,但是很多树莓派系统的原汁原味还是保留的很好.这样就不需要我们自己还要对lakka的源 ...
 - CLRInjection - 通用托管注入(超级灰色按钮克星升级版)
			
通用托管注入 - CLRInjection CLR软件系列第二发: 通用托管注入 - CLRInjection 软件简介:这款软件可以将任意托管DLL用插件的形式,注入到正在运行中的.net托管程序集 ...
 - python--爬虫基础
			
http://files.cnblogs.com/files/Kobe10/Python__%E7%88%AC%E8%99%AB%E5%9F%BA%E7%A1%80.pdf
 - ISE 14.7 XST.exe stop working
			
http://www.xilinx.com/support/answers/59851.html Description XST completes but then instead of retur ...
 - js/jq基础(日常整理记录)-1-纯js格式化时间
			
一.纯js格式化时间 之前记录了一些,工作中发现的比较常用的使用,就记录一下. 由于很基础,就直接贴出来了,不做分析了. 改造一下Date的原型 Date.prototype.format = fun ...