MySQL 8.0来了,逆之者亡...
1. MySQL8.0的版本历史
2016-09-12第一个DM(development milestone)版本8.0.0发布
2018-04-19第一个GA(General Availability)版本开始,8.0.11发布
2018-07-27 下一个GA版本,8.0.12发布
2018-10-22 下一个GA版本,8.0.13发布
2019-01-21 下一个GA版本,8.0.14发布
最新的GA版本为8.0.15,于2019-02-01发布
最近待GA的版本为8.0.16, 8.0.17,
从中可以看出,大概每1~3个月一个版本。
2. MySQL8.0中新增的特性
事务性数据字典
数据字典表以InnoDB表存储字典数据,位于mysql数据库下,对外不可见。有专门的表空间mysql.idb,位于数据目录下。但是可以通过informaction_schema下面的一些表来查询字典数据。
在以前的版本中,字典数据以元数据文件、非事务表等来存储。现在这些元数据文件被删除了。比如:
.frm, .par, .trn, .isl, .db.opt等都在MySQL8.0中不存在了。
原子DDL
事务性数据字典的引入,使得原子DDL成为可能。作为事务要不提交,要不回滚。分为表级和非表级语句,表级支持InnoDB。非表级包括:create, drop等语句。
安全和账号管理
Mysql系统数据库下的权限表现在都是InnoDB的,以前是MyISAM的,对于多个用户进行操作时会出现部分成功,部分失败的情况。现在要不成功,要不rollback。
新的caching_sha2_password认证插件作为默认的认证插件,比mysql_native_password更安全,性能更好。但可能在现网会出现一个连接相关的问题。
支持角色(role)
对于密码管理更加严格控制,可以维护密码历史信息。启用密码重用策略。
资源管理
支持资源组的创建和管理,能将运行的线程分配给特定的资源组。
InnoDB增强
自增列方面。现在自增列计数器会在每次值修改时,将值写到REDO LOG中,并且在CHECKPOINT时写到存储引擎私有的系统表中。这就消除了以往重启实例自增列不连续的问题。
当索引损坏时,会把损坏标识写到redo log。在checkpoint时会将内存的损坏标识数据写到存储引擎私有的系统表中。
InnoDB memcached插件支持多个get操作(在单个memcached查询中获取多个键值对)和范围查询。
新的动态变量innodb_deadlock_detect,可以禁用死锁检查。在高并发的系统中,无数个线程等待同一个锁,死锁检查可能会引起系统宕机。有时,禁用死锁检查更有效。当死锁发生时,可以依赖innodb_lock_wait_timeout设置让事务回滚。
新的information_schema.innodb_cached_indexes表可以报告每个索引在bufferpool中的索引页的数量。
InnoDB临时表现在创建在共享的临时表空间中。
支持redo log和undo log的加密
对于select…for share和select…for update 锁读语句,支持nowait和skip locked选项。Nowait表示如果请求的行被去其他事务锁住了立即返回。SKIP LOCKED则会从结果集中移除上锁的行。
InnoDB存储引擎使用MySQL的数据字典,而不是用自己的和引擎相关的数据字典。
mysql库的系统表和数据字典表创建在单独的InnoDB表空间中,文件名为mysql.ibd. 以前这些表都是创建在各自的InnoDB表空间中。
字符集支持
默认字符集从latin1变成了utf8mb4. 对于utf8mb4字符集增加了新的比较规则,比如utf8mb4_ja_0900_as_cs。
JSON增强
数据类型支持
MySQL支持将字符常量或者表达式作为数据类型的默认值。包括能将表达式作为BLOB, TEXT, GEOMETRY, JSON等数据类型的默认值,这在以前是不可以的。
优化器
通用表表达式
在SELECT等语句前,使用WITH字句来对临时结果集进行命名。
窗口函数
MySQL现在支持窗口函数,在一个查询中对每行进行计算。这些函数包括RANK(), LAG(), NTILE()。另外,有几个聚合函数也能用作窗口函数。比如SUM(),AVG()。
横向派生表(Lateral derived tables)
支持正则表达式
内部临时表
内存内部临时表,默认的存储引擎从MEMORY变成了TempTable。TempTable对于VARCHAR和VARBINARY字段存储更高效。
Internal_tmp_mem_storage_engine:该变量用来定义内存内部临时表使用哪个引擎。允许取值有TempTable(默认)和MEMORY。
Temtable_max_ram: 内存内部临时表超过这个值就会将数据存储到磁盘上。
日志记录
错误日志模块使用MySQL组件架构重写了,使用内置的组件来实现错误日志。
另外,还有一个可加载的JSON日志记录器。 要控制启用哪些日志组件,使用 log_error_services 系统变量。
备份锁
引入了一种新的备份锁(backup lock),它允许在online备份的时候进行DML操作,同时可防止快照不一致。备份锁由lock instance for backup和unlock instance语法支持。使用这些语句需要BACKUP_ADMIN权限。
原来的extrabackup等备份软件是不是应该改写,不要使用flush table with read lock这样的语句来上锁。
当有大事务时,会hung住,无法备份。
如果采用lock instance for backup则没有问题。
复制增强
支持使用压缩格式,对JSON文档的部分更新记录binlog,能节省空间。如果使用的STATEMENT格式的binlog,该功能自动开启,或者通过binlog_row_value_options系统变量设为PARTIAL_JASON来开启。
连接管理
允许配置一个专门端口用于管理连接,当连接数打满时可以用于连接数据库进行管理。
需要设置admin_address,默认该值为空。
使用的端口默认为33062, 由admin_port来设置。
该端口的没有连接数的限制。
需要有SERVICE_CONNECTION_ADMIN的权限
Create_admin_listener_thread系统变量用来决定是用普通连接的监听线程还是采用自己专用的线程。默认值为普通监听线程。
操作如下:
mysql> show variables like 'admin_%';
+---------------+---------------+
| Variable_name | Value |
+---------------+---------------+
| admin_address | 192.168.1.187 | //这个IP地址是服务器的地址,不是客户端的。一定要设置这个变量
| admin_port | 33062 |
+---------------+---------------+
2 rows in set (0.00 sec)
然后将max_connections调小,制造连接数打满的场景。
mysql> set global max_connections=30;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 30 |
+-----------------+-------+
1 row in set (0.00 sec)
nohup mysql -h192.168.1.187 -P3306 -uroot -p****** -NBe 'select sleep(2000)' &
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1040 (HY000): Too many connections
此时,发现还可以用管理端口进行连接,并且没有数量限制。
mysql -h192.168.1.187 -P33062 -uroot -p******
插件
以前MySQL的插件可以用C和C++编写。现在插件使用的MySQL头文件是c++代码,意味着现在的插件必须用C++,不能用C编写。
原文链接:
https://blog.csdn.net/devcloud/article/details/91802620
分割线
MySQL被Sun收购后,搞了个过渡的6.0版本,没多久就下线了(有一次居然听说有人在线上用6.0版本,我惊得下巴都掉了)。被Oracle收购后,终于迎来了像样的5.6版本,之后就是5.7、8.0版本。这么看来,Sun的衰亡不无道理。
P.S,上面说了6.0版本号已被用过,7.x系列版本专用于NDB Cluster,因而新版本号从8.0开始。
刚被Oracle收购时,大家恐慌的不行,貌似还甚至搞了个联合签名请愿活动来着,可惜真的是应了那句话“天下大势,浩浩汤汤,顺之者昌,逆之者亡”。
创始人Monty又折腾了MariaDB,可惜也是不温不火的。MySQL 8.0发布后,MariaDB宣布不打算继续合并InnoDB引擎,这下就更尴尬了,以后还能愉快的玩耍了吗?这两年Monty老先生还时不时来中国露个脸,但似乎有那么一丢丢变味了。
闲话少说,一起来看看8.0都有哪些真香特性吧。
1. 为什么是8.0
作为迄今为止,地表最强的MySQL版本,8.0被寄予厚望。
虽然在很多人眼里,MySQL 8.0无非是有个"好爹",很多新特性是照着Oracle"抄"的。但在我看来,Oracle作为先驱前辈,已经证明了这些技术的优秀之处,有什么理由不借鉴呢,难道非要折腾出一些只为了能自嗨的莫名其妙的特性才叫牛逼,比如只能用触发器变相实现的表分区功能的某DB?
再说了,即便有个”好爹“,就一定能做好吗,国民老公不也被限制消费了?
MySQL 8.0无论在功能还是性能(整体上),都是目前最好的MySQL版本。以往因为某些特性不支持,导致需要在业务代码、逻辑上做一些妥协,甚至增加使用第三方解决方案(例如NOSQL)。
我相信从8.0开始,以后这种情况会越来越少的,MySQL会越来越好,绝大多数和数据库相关的业务需求,都能在MySQL中完成。当然了,我也相信它不会为了哗众取宠,堆砌一些无谓的功能,变成另一个“最好用”的数据库。
2. MySQL 8.0哪里香
截止本文发稿,MySQL最新版本是8.0.19。下面是站在我个人角度上,认为最香的几个特性。
2.1 性能优化相关
- 无疑是hash join。相信DBA们被弱鸡开发坑怕了,有了hash join再也不那么怕没索引的多表join了。还有一个,anti join。
hash join刚出来时,我做了个简单的测试,当时也发了过朋友圈:
- 快速加新列。做过游戏DBA的我简直热泪盈眶,想想以前早起做变更的苦逼岁月(╥╯^╰╥)
- 直方图。没有索引,不想建索引,索引不准确?不怕,还有直方图兜底。
- 函数索引、表达式索引,开发者们该爱死这两个功能了吧。
- 消除了全局的buffer pool mutex。话说这个特性Percona好像在5.5版本就有了,官方团队在这块的动作慢的有点厉害啊。
- 倒序索引。任你正序排,倒序排,还是混合顺序排,啥姿势都能满足,em...
- 不可见索引。删个索引,想删又不太敢动手,怎么破?不可见索引来救命。改为不可见后,观察一阵子,确认没影响了再放心删除吧。
- 引入WRITESET模式,大大提高并行复制效率,主从复制延迟进一步缩小。
- 针对JSON数据类型,增加Multi-valued indexes,更方便JSON的搜索了。
- HINT语法增强,更方便在执行查询时动态设定选项,针对不同SQL采用不同策略。
- 有个新的TempTable引擎,比原来的tmptable强不少。
- 其他优化。
2.2 管理、复制、安全方面的功能提升
3. 看完了还不想上车?
细心的读者,或许能发现在官方文档第一章"Chapter 1 General Information"里头,有这么一段话:
Support for setting user variables in statements other than
SET was deprecated in MySQL 8.0.13. This functionality is
subject to removal in MySQL 9.0.
嗯,你没看错,是的,下一个就是9.0版本,按照经验,2020年也应该要发布了。再吼一下,MySQL 8.0来了,高铁般的速度,再不上车您就直接用9.0吧。由我主讲的知数堂「MySQL优化课」第17期即将开始,我们的课程从第15期就升级成MySQL 8.0版本了,现在上车刚刚好,一起开启MySQL 8.0的修行之旅吧。
作者:叶金荣
链接:https://zhuanlan.zhihu.com/p/110271719
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- 正式推出Group Relication。很好,在稳步朝着高性能、高可用方向推进,先实现读可扩展,再实现写可扩展。期待不远的将来再实现分布式Sharding,到那时候,现在市面上那些吹得不可一世的NEWSQL们该哑火了,这两年有点憋屈的说。
- Clone Plugin以及ReplicaSet特性,配合MySQL Shell,想要部署一个新的slave实例,或者是InnoDB Cluster节点,就方便很多了。
- sqlrequireprimary_key选项设定强制要求每个表都得有个主键。在主从环境中,相信太多人吃过没主键的亏了。当然了,我并没有,嘿。
- 实例重启后的自增ID持久化,小增强却解决了业务上的逻辑大麻烦。
- extra admin port,管理员可以给自己开后门了。
- 在线修改完配置参数后,SET PERSIST语法实现持久化,不用再手工修改一次my.cnf了。
- 锁增强,增加SKIP LOCK、NOWAIT LOCK锁模式,以及BACKUP LOCk。
- 窗口函数、CTE。做统计分析同学的福音。
- 其他提升。
-
更多的特性,可以访问下面几个资料查看。
- MySQL 8.0新特性
- MySQL 8.0相对于5.7的复制改进
- 从MySQL5.5到MySQL8.0子查询进化之路