zoukankan      html  css  js  c++  java
  • mysql8新特性

    1. 默认字符集由latin1变为utf8mb4

    在8.0版本之前,默认字符集为latin1,utf8指向的是utf8mb3,8.0版本默认字符集为utf8mb4,utf8默认指向的也是utf8mb4。
    注:在Percona Server 8.0.15版本上测试,utf8仍然指向的是utf8mb3,与官方文档有出入。

    2. MyISAM系统表全部换成InnoDB表

    系统表全部换成事务型的innodb表,默认的MySQL实例将不包含任何MyISAM表,除非手动创建MyISAM表。

    3. 自增变量持久化

    在8.0之前的版本,自增主键AUTO_INCREMENT的值如果大于max(primary key)+1,在MySQL重启后,会重置AUTO_INCREMENT=max(primary key)+1,这种现象在某些情况下会导致业务主键冲突或者其他难以发现的问题。自增主键重启重置的问题很早就被发现(https://bugs.mysql.com/bug.php?id=199),一直到8.0才被解决,8.0版本将会对AUTO_INCREMENT值进行持久化,MySQL重启后,该值将不会改变。

    4. DDL原子化

    InnoDB表的DDL支持事务完整性,要么成功要么回滚,将DDL操作回滚日志写入到data dictionary 数据字典表 mysql.innodb_ddl_log 中用于回滚操作,该表是隐藏的表,通过show tables无法看到。通过设置参数,可将ddl操作日志打印输出到mysql错误日志中。

    5. 参数修改持久化

    MySQL 8.0版本支持在线修改全局参数并持久化,通过加上PERSIST关键字,可以将修改的参数持久化到新的配置文件(mysqld-auto.cnf)中,重启MySQL时,可以从该配置文件获取到最新的配置参数。
    例如执行:
    set PERSIST expire_logs_days=10 ;
    系统会在数据目录下生成一个包含json格式的 mysqld-auto.cnf 的文件,格式化后如下所示,当 my.cnf 和 mysqld-auto.cnf 同时存在时,后者具有更高优先级。

    6. 新增降序索引

    MySQL在语法上很早就已经支持降序索引,但实际上创建的仍然是升序索引,如下MySQL 5.7 所示,c2字段降序,但是从show create table看c2仍然是升序。8.0可以看到,c2字段降序。

    7. group by 不再隐式排序

    mysql 8.0 对于group by 字段不再隐式排序,如需要排序,必须显式加上order by 子句。

    8. JSON特性增强

    MySQL 8 大幅改进了对 JSON 的支持,添加了基于路径查询参数从 JSON 字段中抽取数据的 JSON_EXTRACT() 函数,以及用于将数据分别组合到 JSON 数组和对象中的 JSON_ARRAYAGG() 和 JSON_OBJECTAGG() 聚合函数。

    在主从复制中,新增参数 binlog_row_value_options,控制JSON数据的传输方式,允许对于Json类型部分修改,在binlog中只记录修改的部分,减少json大数据在只有少量修改的情况下,对资源的占用。

    9. redo & undo 日志加密

    增加以下两个参数,用于控制redo、undo日志的加密。
    innodb_undo_log_encrypt
    innodb_undo_log_encrypt

    10. innodb select for update跳过锁等待

    select ... for update,select ... for share(8.0新增语法) 添加 NOWAIT、SKIP LOCKED语法,跳过锁等待,或者跳过锁定。
    在5.7及之前的版本,select...for update,如果获取不到锁,会一直等待,直到innodb_lock_wait_timeout超时。

    在8.0版本,通过添加nowait,skip locked语法,能够立即返回。如果查询的行已经加锁,那么nowait会立即报错返回,而skip locked也会立即返回,只是返回的结果中不包含被锁定的行。

    11. 增加SET_VAR语法

    在sql语法中增加SET_VAR语法,动态调整部分参数,有利于提升语句性能。

    • select /*+ SET_VAR(sort_buffer_size = 16M) */ id from test order id ;
    • insert /*+ SET_VAR(foreign_key_checks=OFF) */ into test(name) values(1);

    12. 支持不可见索引

    使用INVISIBLE关键字在创建表或者进行表变更中设置索引是否可见。索引不可见只是在查询时优化器不使用该索引,即使使用force index,优化器也不会使用该索引,同时优化器也不会报索引不存在的错误,因为索引仍然真实存在,在必要时,也可以快速的恢复成可见。

    13. 支持直方图

    优化器会利用column_statistics的数据,判断字段的值的分布,得到更准确的执行计划。

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

    直方图统计了表中某些字段的数据分布情况,为优化选择高效的执行计划提供参考,直方图与索引有着本质的区别,维护一个索引有代价。每一次的insert、update、delete都会需要更新索引,会对性能有一定的影响。而直方图一次创建永不更新,除非明确去更新它。所以不会影响insert、update、delete的性能。

    14. 新增innodb_dedicated_server参数

    能够让InnoDB根据服务器上检测到的内存大小自动配置innodb_buffer_pool_size,innodb_log_file_size,innodb_flush_method三个参数。

    15. 日志分类更详细

    在错误信息中添加了错误信息编号[MY-010311]和错误所属子系统[Server]

    16. undo空间自动回收

    • innodb_undo_log_truncate参数在8.0.2版本默认值由OFF变为ON,默认开启undo日志表空间自动回收。
    • innodb_undo_tablespaces参数在8.0.2版本默认为2,当一个undo表空间被回收时,还有另外一个提供正常服务。
    • innodb_max_undo_log_size参数定义了undo表空间回收的最大值,当undo表空间超过这个值,该表空间被标记为可回收。

    17. 增加资源组

    MySQL 8.0新增了一个资源组功能,用于调控线程优先级以及绑定CPU核。
    MySQL用户需要有 RESOURCE_GROUP_ADMIN权限才能创建、修改、删除资源组。
    在Linux环境下,MySQL进程需要有 CAP_SYS_NICE 权限才能使用资源组完整功能。

    默认提供两个资源组,分别是USR_default,SYS_default

    创建资源组:
    create resource group test_resouce_group type=USER vcpu=0,1 thread_priority=5;
    将当前线程加入资源组:
    SET RESOURCE GROUP test_resouce_group;
    将某个线程加入资源组:
    SET RESOURCE GROUP test_resouce_group FOR thread_id;
    查看资源组里有哪些线程:
    select * from Performance_Schema.threads where RESOURCE_GROUP='test_resouce_group';
    修改资源组:
    alter resource group test_resouce_group vcpu = 2,3 THREAD_PRIORITY = 8;
    删除资源组 :
    drop resource group test_resouce_group;

    18. 增加角色管理

    角色可以认为是一些权限的集合,为用户赋予统一的角色,权限的修改直接通过角色来进行,无需为每个用户单独授权。

  • 相关阅读:
    nginx变量(日志log_format)
    nginx中间件
    social-auth-app-django集成第三方登录
    Django REST Framework限速
    django-redis
    Django REST Framework extensions
    django-rest-framework-jwt
    FromXml 支付回调 xml 转数组
    下个月此时
    PHP 暂停函数 sleep() 与 usleep() 的区别
  • 原文地址:https://www.cnblogs.com/peteremperor/p/14218116.html
Copyright © 2011-2022 走看看