一. Mysql8.0版本相比以前版本的一些特性mysql
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浪费空间。sql
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: t1
Create 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_ci
1 row
in
set
(0.00 sec)
ERROR:
No query specified
|
另外,因为降序索引的引入,MySQL 8.0不再会对group by操做进行隐式排序json
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: NO
1 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" : "" } } } }bash
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 1
mysql>
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数据库目录中的各个表空间文件中建立的;