暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mysql 各个版本的特性

辣肉面加蛋加素鸡 2021-08-06
1106

mysql8.0发布有段时间了,整体口碑个还是不错的,现在来看看几个大版本间的区别。

个版本发布时间

信息来源:https://en.wikipedia.org/wiki/MySQL#Release_history

从发布进度来看,基本上3年一个大版本,产品支持周期大约为8年。

个版本新增特性

5.5 版本

5.5版本已经算老古董了,但它是mysql质变的一个版本,简单看下相较于5.1版本,它有哪些变化。

1. 性能方面

  • 默认innodb引擎,具有提交、回滚和crash恢复功能、ACID兼容。

  • 新增行级锁,大大增加并发。

  • 表与索引存储在表空间、表大小无限制。

  • 支持dynamic(primary key缓存内存 避免主键查询引起的IO )与compressed(支持数据及索引压缩,就我们现有业务可在归档表上应用)行格式。

  • InnoDB plugin文件格式Barracuda、支持表压缩、节约存储、提供内存命中率、truncate table速度更快。

  • Innodb_thread_concurrency默认为0,线程并发数无限制,可根据具体应用设置最佳值。

  • Innodb_io_capacity可以动态调整刷新脏页的数量,改善大批量更新时刷新脏页跟不上导致的性能下降问题。Default:200,跟硬盘的IOPS有关。

  • buffer pool多实例 :innodb_buffer_pool_instances 参数增加innodb_buffer_pool实例个数,大大降低buffer pool的mutex争抢过热情况。

  • 自适应刷新脏页

  • 热数据存活更久

2. 稳定性方面

  • 支持半同步Replication(我们现在使用的mha就是基于半同步复制的)

  • 增加Relay Log 自我修复功能。

  • Crash recovery,相较之前版本,数据库crash后有一定的自我修复功能。

  • 引入红-黑树做插入排序的中间数据结构,时间复杂度大大降低,减少恢复时间。

  • Thread Pool,分组排队、限流,避免溢出导致数据库崩溃的状况。

5.6 版本

目前,我们生产使用的就是5.6版本(5.6.24-log),相比5.5版本,各个方面都有提升。

1. 基础变更

  • 默认参数改变,调整了几项默认参数,使数据库能更好地发挥。

  • 支持全文索引,生产业务基本不会用全文索引。

  • 支持online DDL,DDL期间可以进行DML操作。但实际上在高并发的业务场景下,online DDL,会严重阻塞业务,推荐使用pt-osc或者gh-ost去进行大表DDL。

  • 可以在建表时指定表空间位置,如:create table external (x int unsigned not null primary key)data directory = '/tmp/data';
    。不建议以这种方式去建表。

  • 整合了memcached API,可以使用API来直接访问innodb表,并非SQL(减少SQL解析、查询优化代价)

  • 减少内部数据结构开销,减少read view。

  • 统计信息持久化,mysqld重启后不丢失。不用每次启动后重新统计,减少开销。

  • explain语句支持insert,update,delete,replace语句。

2. innodb改进

  • innodb只读事务,不需要设置TRX_ID字段。

  • innodb表空间在线迁移(TransportableTablespaces)。

  • redo log最大可增长到512G。

  • innodb后台线程独立出来。

3. 优化器改进

  • ICP:Index Condition Pushdown,mysql使用索引从表中检索行数据的一种优化方式

    • 可以在引擎层直接过滤数据,避免二次回表

    • 节省BP(buffer pool)空间,提高查询性能

  • BKA:Batched Key Access,提高表join性能的算法

    • SQL通过辅助索引要访问表数据时候,将大量的随机访问放入缓存,交给MRR接口合并为顺序访问

  • MRR:Multi-Range Read,优化器将随机 IO 转化为顺序 IO 以降低查询过程中 IO 开销的一种手段

    • 在BKA算法应用之后,通过MRR接口合并随机访问为顺序访问,再去检索表数据

    • 变大量随机为顺序访问。在通过辅助索引检索大量数据时,性能提升明显

    • 磁头无需来回寻道,page只需读取一次,且较好利用了innodb线性预读功能(每次预读64个连续page)

5.7 版本

5.7版本是目前市面上使用较多的版本,其稳定性及性能都得到了证明。我们测试环境已部署5.7版本,使用下来,暂无问题。

1. 安全性

  • 用户表 mysql.user 的 plugin字段不允许为空, 默认值是 mysql_native_password,而不是 mysql_old_password,不再支持旧密码格式。

  • 增加密码过期机制,过期后需要修改密码,否则可能会被禁用,或者进入沙箱模式。

  • 提供了更为简单SSL安全访问配置,并且默认连接就采用SSL的加密方式。

2. 灵活性

  • MySQL数据库从5.7.8版本开始,也提供了对JSON的支持。

  • 可以混合存储结构化数据和非结构化数据,同时拥有关系型数据库和非关系型数据库的优点。

  • generated column是MySQL 5.7引入的新特性,所谓generated column,就是数据库中这一列由其他列计算而得。但是性能消耗比较大,需谨慎使用。

3. 易用性

  • 在MySQL 5.7 之前,如果用户输入了错误的SQL语句,按下 ctrl+c ,虽然能够”结束”SQL语句的运行,但是,也会退出当前会话,MySQL 5.7对这一违反直觉的地方进行了改进,不再退出会话。这个对运维人员来说实在是太友好了!

  • MySQL 5.7可以explain一个正在运行的SQL,这对于DBA分析运行时间较长的语句将会非常有用。

  • sys schema是MySQL 5.7.7中引入的一个系统库,包含了一系列视图、函数和存储过程, 该项目专注于MySQL的易用性。

4. 可用性

  • 在线设置 复制的过滤规则 不再需要重启MySQL,只需要停止SQLthread,修改完成以后,启动SQLthread。这个改动非常好,我们现在如果需要过滤,必须重启源库和同步库,非常麻烦。

  • 在线修改buffer pool的大小。

  • 在线开启GTID ,在之前的版本中,由于不支持在线开启GTID,用户如果希望将低版本的数据库升级到支持GTID的数据库版本,需要先关闭数据库,再以GTID模式启动,所以导致升级起来特别麻烦。

  • Online DDL MySQL 5.7支持重命名索引和修改varchar的大小,这两项操作在之前的版本中,都需要重建索引或表。

5. 性能提升

  • 临时表的性能改进

    • 临时表只在当前会话中可见

    • 临时表的生命周期是当前连接(MySQL宕机或重启,则当前连接结束)

  • 只读事务性能改进,通过避免为只读事务分配事务ID ,不为只读事务分配回滚段,减少锁竞争等多种方式,优化了只读事务的开销,提高了数据库的整体性能。

  • 复制性能的改进,默认配置是库级别的并行复制,为了充分发挥MySQL 5.7的并行复制的功能。将slave-parallel-type配置成LOGICAL_CLOCK,可能一定程度上减少主从复制的延迟。

  • 支持多源复制

6. 默认参数变更

  • 默认binlog格式调整为ROW格式。

  • 默认binlog错误后的操作调整为ABORT_SERVER。在先前的选项下(binlog_error_action=IGNORE_ERROR),如果一个错误发生,导致无法写入binlog,mysql-server会在错误日志中记录错误并强制关闭binlog功能。这会使mysql-server在不记录binlog的模式下继续运行,导致从库无法继续获取到主库的binlog。

  • 默认开启mysql崩溃时的binlog安全。

  • 默认调低slave_net_timeout。

7. 重置安装方式

  • mysql_install_db已经不再推荐使用了,建议改成mysqld --initialize 完成实例初始化。如果 datadir 指向的目标目录下已经有数据文件,则会有[ERROR] Aborting。

  • 在初始化时如果加上 --initial-insecure,则会创建空密码的 root@localhost 账号,否则会创建带密码的 root@localhost 账号,密码直接写在 log-error 日志文件中;新用户登入后需要立刻修改密码,否则无法继续后续的工作。

8.0 版本

8.0是mysql最新的大版本,性能及使用便捷性均大幅提升(官方数据,未测试)。

下面来详细看下8.0的一些变化,来源mysql8.0的release notes,https://dev.mysql.com/doc/relnotes/mysql/8.0/en/

1. 功能增强

  • 隐藏索引:

    索引可以被“隐藏”和“显示”。当对索引进行隐藏时,它不会被查询优化器所使用。我们可以使用这个特性用于性能调试,例如我们先隐藏一个索引,然后观察其对数据库的影响。如果数据库性能有所下降,说明这个索引是有用的,然后将其“恢复显示”即可;如果数据库性能看不出变化,说明这个索引是多余的,可以考虑删掉。

  • 降序索引:

    为索引提供按降序方式进行排序的支持,在这种索引中的值也会按降序的方式进行排序。下次单独讲一下降序索引。

  • 窗口函数:

    可以用来实现若干新的查询方式。窗口函数与 SUM()、COUNT() 这种集合函数类似,但它不会将多行查询结果合并为一行,而是将结果放回多行当中。即窗口函数不需要 GROUP BY。这个很好用,但比较难理解,下次单独分析下窗口函数。

  • 备份锁:

    新增备份锁,允许在线备份期间的DML,同时防止可能导致快照不一致的操作。 备份锁由LOCK INSTANCE FOR BACKUP和UNLOCK INSTANCE语法支持

  • 直方图:

    可以使用 ANALYZE TABLE table_name [UPDATE HISTOGRAM on col_name with N BUCKETS |DROP HISTOGRAM ON clo_name] 来收集或者删除直方图信息

  • 查询优化器增强

    在制定执行计划时,会考虑数据是否在BufferPool中。而在此之前,是假设数据都在磁盘中

  • atomic DDL

    8.0 开始支持原子 DDL(atomic DDL),数据字典的更新,存储引擎操作,写二进制日志结合成了一个事务。

    举个栗子:

    在没有原子DDL之前,DROP TABLE test1,test2;如遇到server crash,可能会有test1被drop了,test2没有被drop掉。有了原子DDL,就不会发生这种情况。

2. 安全性

  • SSL改进

    默认连接开启SSL,特别要注意从低版本升到8.0后,要修改连接的ssl参数。

  • 新增role权限

    role可以看做一个权限的集合,这个集合有一个统一的名字role名。可以给多个账户统一的某个role的权限权限的修改直接通过修改role来实现,不需要每个账户一个一个的grant权限,方便运维和管理。

  • 密码历史功能

    新增密码历史记录功能,限制重复使用以前的密码。

  • 新增caching_sha2_password认证插件

    默认的认证插件由mysql_native_password更改为caching_sha2_password

  • 密码修改方式变更

    移除PASSWORD()函数。这就意味着无法通过“SET PASSWORD ... = PASSWORD('auth_string') ”命令修改用户密码。

3. innodb增强

  • 临时表创建

    InnoDB临时表都将在共享临时表空间ibtmp1中创建

  • NOWAIT和SKIP LOCKED的支持

    对于SELECT ... FOR SHARE和SELECT ... FOR UPDATE语句,InnoDB支持NOWAIT和SKIP LOCKED(一般用来解决电商场景热点行问题)

  • 新增系统视图

    新增INFORMATION_SCHEMA.INNODB_TABLESPACES_BRIEF视图

  • 表空间重命名

    支持 ALTER TABLESPACE ... RENAME TO 语法

  • 可视的索引页数

    新增INFORMATION_SCHEMA.INNODB_CACHED_INDEXES,查看每个索引缓存在InnoDB缓冲池中的索引页数

  • 禁用死锁检测

    新增了动态配置项 innodb_deadlock_detect,用来禁用死锁检查,因为在高并发系统中,当大量线程等待同一个锁时,死锁检查会大大拖慢数据库。(貌似5.7.15就有这个参数了)

  • 系统的锁信息表

    information_schema中的innodb_locks和innodb_lock_waits表被移除,取而代之的是performance_schema中的data_locks和data_lock_waits表

  • innodb_dedicated_server

    自动配置缓冲池大小

    检测到的服务器内存日志文件的大小
    <1GB128M(在innodb_buffer_pool_size 默认设)
    <= 4GB检测到的服务器存储器* 0.5
    > 4G检测到的服务器内存* 0.75
  • 自适应innodb_log_file_size参数

    自动配置的日志文件大小

    检测到的服务器内存日志文件的大小
    <1GB48M(在innodb_log_file_size 默认设置)
    <= 4GB128M
    <= 8GB512M
    <= 16GB1024M
    > 16GB2048M

4. 配置文件增强

  • 在线修改全局参数持久化

    MySQL 8.0版本支持在线修改全局参数持久化,通过加上PERSIST关键字,可以将调整持久化到新的配置文件中,再次重启db还可以应用到最新的参数。对于加上 PERSIST 关键字修改参数命令,MySQL系统会生成一个包含json格式数据的 mysqld-auto.cnf 文件

    比如:

    set PERSIST  binlog_expire_logs_seconds = 604800 ; #内存和json文件都修改,重启还生效

    set GLOBAL binlog_expire_logs_seconds = 604800 ; #只修改内存,重启丢失

    复制

    系统会在数据目录下生成一个包含如下内容的 mysqld-auto.cnf 的文件,当 my.cnf 和 mysqld-auto.cnf 同时存在时,后者具有高优先级。

关于8.0

8.0上线快一年了,目前还属于踩坑阶段,真正在线上使用8.0版本的公司并不是很多。但其优秀的性能、实用的功能还是很具诱惑力的,现在可以多测试测试,争取在该版本稳定后,能第一时间用上。下附mysql8.0简单的安装教程(centos6及centos7均可用),可以先体验起来:

安装yum源

#CentOS 7
cd home/downloads
wget https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
sudo rpm -ivh mysql80-community-release-el7-1.noarch.rpm

#CentOS 6
cd home/downloads
wget https://dev.mysql.com/get/mysql80-community-release-el6-1.noarch.rpm
sudo rpm -ivh mysql80-community-release-el6-1.noarch.rpm

复制

安装mysql8.0

#安装
sudo yum -y install mysql-community-server

#
启动服务
sudo systemctl start mysqld

#
查看版本信息
mysql -V

复制

使用

#查看MySQL为Root账号生成的临时密码
grep "A temporary password" var/log/mysqld.log

#进入MySQL shell
mysql -u root -p

#修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Mypwd123!'; #密码有复杂度要求,若想使用简易密码,请往下看

复制

修改简易密码

#修改简单密码策略
mysql> set global validate_password.policy=0;

mysql> set global validate_password.length=1;

ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

复制


文章转载自辣肉面加蛋加素鸡,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论