【MySQL】——MySQL的版本演变史和新特性
⼀、前⾔
⼤家可能也发现了,我最近在死磕MySQL了。MySQL应该是我们⽤的最多的关系型数据库了。因为⼯作需要,基础架构开发数据库多版本⽀持是绕不开的,今天好好整理了⼀下发现,mysql也不学好,版本从5.7⼤跨步进⼊8.0。那都有哪些版本,分别有什么改变呢?这就是本⽂要说的事情。
⼆、MySQL版本演变史
下⾯仅从产品特性的⾓度梳理其发展过程中的⾥程碑事件。
1995年,MySQL 1.0发布,仅供内部使⽤。
1996年,MySQL 3.11.1发布,直接跳过了MySQL 2.x版本。
1999年,MySQL AB公司成⽴。同年,发布MySQL 3.23,该版本集成了Berkeley DB存储引擎。该引擎由Sleepycat公司开发,⽀持事务。在集成该引擎的过程中,对源码进⾏了改造,为后续可插拔式存储引擎架构奠定了基础。
2000年,ISAM升级为MyISAM存储引擎。同年,MySQL基于GPL协议开放源码。
2002年,MySQL 4.0发布,集成了后来⼤名⿍⿍的InnoDB存储引擎。该引擎由Innobase公司开发,⽀持事务,⽀持⾏级锁,适⽤于OLTP等⾼并发场景。
2005年,MySQL 5.0发布,开始⽀持游标,存储过程,触发器,视图,XA事务等特性。同年,Oracle收购Innobase公司。
2008年,Sun以10亿美⾦收购MySQL AB。同年,发布MySQL 5.1,其开始⽀持定时器(Event scheduler),分区,基于⾏的复制等特性。
2009年,Oracle以74亿美⾦收购Sun公司。
2010年,MySQL 5.5发布,其包括如下重要特性及更新。 InnoDB代替MyISAM成为MySQL默认的存储引擎。 多核扩展,能更充分地使⽤多核CPU。 InnoDB的性能提升,包括⽀持索引的快速创建,表压缩,I/O⼦系统的性能提升,PURGE操作从主线程中剥离出来,Buffer Pool可拆分为多个Instances。 半同步复制。 引⼊utf8mb4字符集,可⽤来存储emoji表情。 引⼊metadata locks(元数据锁)。 分区表的增强,新增两个分区类型:RANGE COLUMNS和LIST COLUMNS。 MySQL企业版引⼊线程池。 可配置IO读写线程的数量(innodb_read_io_threads,innodb_write_io_threads)。在此之前,其数量为1,且不可配置。 引⼊
innodb_io_capacity选项,⽤于控制脏页刷新的数量。
2013年,MySQL 5.6发布,其包括如下重要特性及更新。 GTID复制。 ⽆损复制。 延迟复制。 基于库级别的并⾏复制。
mysqlbinlog可远程备份binlog。 对TIME, DATETIME和TIMESTAMP进⾏了重构,可⽀持⼩数秒。DATETIME的空间需求也从之前的8个字节减少到5个字节。 Online DDL。ALTER操作不再阻塞DML。 可传输表空间(transportable tablespaces)。 统计信息的持久化。避免主从之间或数据库重启后,同⼀个SQL的执⾏计划有差异。 全⽂索引。 InnoDB Memcached plugin。 EXPLAIN可⽤来查看DELETE,INSERT,REPLACE,UPDATE等DML操作的执⾏计划,在此之前,只⽀持SELECT操作。 分区表的增强,包括最⼤可⽤分区数增加⾄8192,⽀持分区和⾮分区表之间的数据交换,操作时显式指定分区。 Redo Log总⼤⼩的限制从之前的4G扩展⾄512G。 Undo Log可保存在独⽴表空间中,因其是随机IO,更适合放到SSD中。但仍然不⽀持空间的⾃动回收。 可dump和load Buffer pool的状态,避免数据库重启后需要较长的预热时间。 InnoDB内部的性能提升,包括拆分kernel mutex,引⼊独⽴的刷新线程,可设置多个purge线程。 优化器性能提升,引⼊了ICP,MRR,BKA等特性,针对⼦查询进⾏了优化。 可以说,MySQL 5.6是MySQL历史上⼀个⾥程碑式的版本,这也是⽬前⽣产上应⽤得最⼴泛的版本。
2015年,MySQL 5.7发布,其包括如下重要特性及更新。 组复制 InnoDB Cluster 多源复制 增强半同步(AFTER_SYNC) 基于WRITESET的并⾏复制。 在线开启GTID复制。 在线设置复制过滤规则。
在线修改Buffer pool的⼤⼩。 在同⼀长度编码字节内,修改VARCHAR的⼤⼩只需修改表的元数据,⽆需创建临时表。 可设置NUMA架构的内存分配策略(innodb_numa_interleave)。 透明页压缩(Transparent Page Compression)。 UNDO表空间的⾃动回收。 查询优化器的重构和增强。 可查看当前正在执⾏的SQL的执⾏计
三、MySQL版本迭代新特性
1、Mysql5.5特性,相对于Mysql5.1
性能提升
默认InnoDB plugin引擎。具有提交、回滚和crash恢复功能、ACID兼容。
⾏级锁(⼀致性的⾮锁定读 MVCC)。
表与索引存储在表空间、表⼤⼩⽆限制。
⽀持dynamic(primary key缓存内存避免主键查询引起的IO )与compressed(⽀持数据及索引压缩)⾏格式。
InnoDB plugin⽂件格式Barracuda、⽀持表压缩、节约存储、提供内存命中率、truncate table速度更快。
原InnoDB只有⼀个UndoSegment,最多⽀持1023的并发;现在有128个Segments,⽀持128K个并发(同样,解决⾼并发带来的事务回滚)。
Innodb_thread_concurrency默认为0,线程并发数⽆限制,可根据具体应⽤设置最佳值。
Innodb_io_capacity可以动态调整刷新脏页的数量,改善⼤批量更新时刷新脏页跟不上导致的性能下降问题。 Default:200,跟硬盘的IOPS有关。
充分利⽤CPU多核处理能⼒innodb_read_io_threads阈值:1-64innodb_write_io_threads阈值:1-64根据数据库的读写⽐灵活设置,充分发挥多CPU、⾼性能存储 ⾃适应刷新脏页
热数据存活更久
buffer pool多实例:innodb_buffer_pool_instances参数增加innodb_buffer_pool实例个数,⼤⼤降低buffer pool的mutex争抢过热情况。
Linux上实现异步IO
重新⽀持组提交
稳定性提升
⽀持半同步Replication。
增加Relay Log ⾃我修复功能。
Crash recovery。
引⼊红-⿊树做插⼊排序的中间数据结构,时间复杂度⼤⼤降低,减少恢复时间。
Thread Pool分组排队限流
2、Mysql5.6特性,相⽐5.5
默认参数的改变
Back_log排队队列
⽀持全⽂索引
⽀持online DDL create,alter,drop
可以在建表时指定表空间位置
create table external (x int unsigned not null primary key)data directory = '/volumes/external1/data';
新增参数innodb_page_size可以设置page⼤⼩
整合了memcached API,可以使⽤API来直接访问innodb表,并⾮SQL(减少SQL解析、查询优化代价)
innodb只读事务,不需要设置TRX_ID字段,
减少内部数据结构开销,减少read view
仅仅⾮只读事务依然需要TRX_ID
innodb改进点
innodb表空间在线迁移(TransportableTablespaces)
undo log可独⽴出系统表空间
redo log最⼤可增长到512G
innodb后台线程独⽴出来
优化器改进
ICP:可以在引擎层直接过滤数据,避免⼆次回表;节省BP空间,提⾼查询性能
BKA:SQL通过辅助索引要访问表数据时候,将⼤量的随机访问放⼊缓存,交给MRR接⼝合并为顺序访问。
MRR:在BKA算法应⽤之后,通过MRR接⼝合并随机访问为顺序访问,再去检索表数据。
变⼤量随机为顺序访问。在通过辅助索引检索⼤量数据时,性能提升明显
磁头⽆需来回寻道,page只需读取⼀次,且较好利⽤了innodb线性预读功能(每次预读64个连续page)。
统计信息持久化,mysqld重启后不丢失
explain语句⽀持insert,update,delete,replace语句,并且⽀持JSON格式
⼦查询优化提升。
3、Mysql5.7特性,相⽐5.5 5.6
MySQL 5.6:初始化数据时需要进到家⽬录的script⽬录下
MySQL 5.7:初始化数据时需要进到家⽬录的bin⽬录下
已然已经废弃了使⽤mysql_install_db这个命令进⾏初始化数据的操作了。使⽤mysqld --initializerubymine是什么软件
安全性:⽤户表mysql.user的plugin字段不允许为空,默认值是mysql_native_password,⽽不是mysql_old_password,不再⽀持旧密码格式;
增加密码过期机制,过期后需要修改密码,否则可能会被禁⽤,或者进⼊沙箱模式;
增加密码过期机制,过期后需要修改密码,否则可能会被禁⽤,或者进⼊沙箱模式;
提供了更为简单SSL安全访问配置,并且默认连接就采⽤SSL的加密⽅式。
灵活性:MySQL数据库从5.7.8版本开始,也提供了对JSON的⽀持。jave jdk
可以混合存储结构化数据和⾮结构化数据,同时拥有关系型数据库和⾮关系型数据库的优点
能够提供完整的事务⽀持
generated column是MySQL 5.7引⼊的新特性,所谓generated column,就是数据库中这⼀列由其他列计算⽽得
易⽤性:在MySQL 5.7之前,如果⽤户输⼊了错误的SQL语句,按下ctrl+c,虽然能够”结束”SQL语句的运⾏,但是,也会退出当前会话,MySQL 5.7对这⼀违反直觉的 MySQL 5.7可以explain⼀个正在运⾏的SQL,这对于DBA分析运⾏时间较长的语句将会⾮常有⽤。
sys schema是MySQL 5.7.7中引⼊的⼀个系统库,包含了⼀系列视图、函数和存储过程,该项⽬专注于MySQL的易⽤性。
例如:如何查看数据库中的冗余索引;如何获取未使⽤的索引;如何查看使⽤全表扫描的SQL语句。
可⽤性:MySQL 5.7通过避免为只读事务分配事务ID,不为只读事务分配回滚段,减少锁竞争等多种⽅式,优化了只读事务的开销,提⾼了数据
在线设置复制的过滤规则不再需要重启MySQL,只需要停⽌SQL thread,修改完成以后,启动SQL thread。
在线修改buffer pool的⼤⼩。
Online DDL MySQL 5.7⽀持重命名索引和修改varchar的⼤⼩,这两项操作在之前的版本中,都需要重建索引或表。
在线开启GTID,在之前的版本中,由于不⽀持在线开启GTID,⽤户如果希望将低版本的数据库升级到⽀持GTID的数据库版本,需要先关闭数据库,再以GTID模
性能
临时表的性能改进。
临时表只在当前会话中可见
临时表的⽣命周期是当前连接(MySQL宕机或重启,则当前连接结束)
只读事务性能改进库的整体性能。
加速连接处理。
在MySQL 5.7之前,变量的初始化操作(THD、VIO)都是在连接接收线程⾥⾯完成的,现在将这些⼯作下发给⼯作线程,以减少连接接收线程的⼯作量,提⾼连接的 复制性能的改进(⽀持多线程复制(Multi-Threaded Slaves, 简称MTS)
MySQL的默认配置是库级别的并⾏复制,为了充分发挥MySQL 5.7的并⾏复制的功能,我们需要将slave-parallel-type配置成LOGICAL_CLOCK。
⽀持多源复制(Multi-source replication)
严格性改变
默认启⽤STRICT_TRANS_TABLES模式。
对ONLY_FULL_GROUP_BY模式实现了更复杂的特性⽀持,并且也被默认启⽤。
dubbo优缺点 其他被默认启⽤的sql mode还有NO_ENGINE_SUBSTITUTION。
默认参数的改变
默认binlog格式调整为ROW格式
默认binlog错误后的操作调整为ABORT_SERVER
在先前的选项下(binlog_error_action=IGNORE_ERROR),如果⼀个错误发⽣,导致⽆法写⼊binlog,mysql-server会在错误⽇志中记录错误并强制关闭binlog功能 默认开启mysql崩溃时的binlog安全。
默认调低slave_net_timeout。
安装不同
mysql_install_db已经不再推荐使⽤了,建议改成mysqld --initialize完成实例初始化。如果datadir指向的⽬标⽬录下已经有数据⽂件,则会有[ERROR] Aborting;
在初始化时如果加上--initial-insecure,则会创建空密码的root@localhost账号,否则会创建带密码的 root@localhost账号,密码直接写在log-error⽇志⽂件中;新4、MySQL8.0和MySQL 5的不同
性能:MySQL 8.0 的速度要⽐ MySQL 5.7 快 2 倍。MySQL 8.0 在以下⽅⾯带来了更好的性能:读/写⼯作负载、IO 密集型⼯作负载、以及⾼竞争(”hot spot”热点竞争问题)⼯作负载。
NoSQL:MySQL 从 5.7 版本开始提供 NoSQL 存储功能,⽬前在 8.0 版本中这部分功能也得到了更⼤的改进。该项功能消除了对独⽴的 NoSQL ⽂档数据库的需求,⽽ MySQL ⽂档存储也为 schema-less 模式的 JSON ⽂档提供了多⽂档事务⽀持和完整的 ACID 合规性。
窗⼝函数(Window Functions):从 MySQL 8.0 开始,新增了⼀个叫窗⼝函数的概念,它可以⽤来实现若⼲新的查询⽅式。窗⼝函数与 SUM()、COUNT() 这种集合函数类似,但它不会将多⾏查询结果合并为⼀⾏,⽽是将结果放回多⾏当中。即窗⼝函数不需要GROUP BY。
隐藏索引:在 MySQL 8.0 中,索引可以被“隐藏”和“显⽰”。当对索引进⾏隐藏时,它不会被查询优化
器所使⽤。我们可以使⽤这个特性⽤于性能调试,例如我们先隐藏⼀个索引,然后观察其对数据库的影响。如果数据库性能有所下降,说明这个索引是有⽤的,然后将其“恢复显⽰”即可;如果数据库性能看不出变化,说明这个索引是多余的,可以考虑删掉。
降序索引:MySQL 8.0 为索引提供按降序⽅式进⾏排序的⽀持,在这种索引中的值也会按降序的⽅式进⾏排序。
通⽤表表达式(Common Table Expressions CTE):在复杂的查询中使⽤嵌⼊式表时,使⽤ CTE 使得查询语句更清晰。
UTF-8 编码:从 MySQL 8 开始,使⽤ utf8mb4 作为 MySQL 的默认字符集。
JSON:MySQL 8 ⼤幅改进了对 JSON 的⽀持,添加了基于路径查询参数从 JSON 字段中抽取数据的 JSON_EXTRACT() 函数,以及⽤于将数据分别组合到 JSON 数组和对象中的 JSON_ARRAYAGG() 和 JSON_OBJECTAGG() 聚合函数。grep命令详解参数
可靠性:InnoDB 现在⽀持表 DDL 的原⼦性,也就是 InnoDB 表上的 DDL 也可以实现事务完整性,要么失败回滚,要么成功提交,不⾄于出现 DDL 时部分成功的问题,此外还⽀持 crash-safe 特性,元数据存储在单个事务数据字典中。
⾼可⽤性(High Availability):InnoDB 集为您的数据库提供集成的原⽣ HA 解决⽅案。
安全性:对 OpenSSL 的改进、新的默认⾝份验证、SQL ⾓⾊、密码强度、授权。
四、其他
1、
创建⽤户和⽤户授权
mysql查看所有存储过程MySQL5.7创建⽤户和⽤户授权命令可以同时执⾏
grant all privileges on *.* to 'zhangsan'@'%' identified by 'zhangsan@2020'java接口例子
MySQL8.0创建⽤户和⽤户授权的命令需要分开执⾏
创建⽤户
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论