Mysql8.0的特性
创始人
2024-05-30 12:13:34
0

Mysql8.0的特性

建议使用8.0.17及之后的版本,更新的内容比较多。

  1. 新增降序索引

    -- 如下所示,我们可以在创建索引时 在字段名后面指定desc进行降序排序
    create table t1(c1 int,c2 int,index idx_c1_c2(c1,c2 desc));
    
  2. group by 不再隐式排序

    mysql5.7的版本我们在进行分组时会自动的对分组字段先进行排序操作,但是8.0版本就去除了这个功能,目的是在进行表迁移时其他数据库没有这个功能,进而出现一个业务问题,所以8.0版本就做到了和其他数据库统一。

    -- 8.0版本group by不再默认排序,需要自己加order by
    select count(*),c2 from t1 group by c2 order by c2;  
    
  3. 增加隐藏索引

    有两种应用场景可以使用隐藏索引:不确定某个索引是否还在使用 进而不确定是否要删除,或者是新创建索引不确定线上环境是否能用。

    如果想删除某个索引,可以先改为隐藏索引,这个时候隐藏索引是不会被sql语句使用,但还是会进行维护,这样如果此索引还在使用就能立刻改回来进行使用,避免了因为数据量大创建索引的耗时操作。

     -- 在创建索引的后面加上invisible关键字create table t2(c1 int, c2 int, index idx_c1(c1), index idx_c2(c2) invisible);-- 这个时候此索引是不会被使用的,我们可以通过修改一个参数  让我们当前session会话能够使用隐藏索引select @@optimizer_switch\G   -- 查看各种参数-- 然后将use_invisible_indexes参数改为on  前面需要加session哦 在会话级别设置查询优化器可以看到隐藏索引set session optimizer_switch="use_invisible_indexes=on";  -- 对已存在的索引进行修改   alter table t2 alter index idx_c2 visible;alter table t2 alter index idx_c2 invisible;
    
  4. 新增函数索引

    就是在创建索引时,索引树中存储的其实是经过函数运算后的值,当然在使用这个索引时where条件中的字段也就必要使用函数了

    create index idx_c1 on t3(c1);     -- 创建普通索引
    create index func_idx on t3((UPPER(c2)));  -- 创建一个大写的函数索引
    
  5. innodb存储引擎select for update跳过锁等待

    对于select … for share(8.0新增加查询共享锁的语法)或 select … for update

    在语句后面添加NOWAIT、SKIP LOCKED语法可以跳过锁等待,或者跳过锁定。

    5.7的版本中如果发生了锁等待就会一直等待 直到innodb_lock_wait_timeout超时。而8.0版本可以可以添加NOWAIT关键字 不需要等到直接报错,添加SKIP LOCKED关键字就会跳过当前正在加锁的数据,返回其他未加锁的数据

    -- session1 给c2字段加一个行锁
    update t1 set ... where c1 = 2; -- 另一个session2  这里就会等待超时
    mysql> select * from t1 where c1 = 2 for update;   
    ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction-- 查询立即返回
    mysql> select * from t1 where c1 = 2 for update nowait;   
    ERROR 3572 (HY000): Statement aborted because lock(s) could not be acquired immediately and NOWAIT is set.-- 查询立即返回,过滤掉了第二行记录
    mysql> select * from t1 for update skip locked; 
    
  6. 新增innodb_dedicated_server自适应参数

    当服务器仅仅只安装了mysql服务,才可以使用此参数,它会根据服务器当前空闲性能自动自动配置innodb_buffer_pool_size,innodb_log_file_size等参数。

    如果当前服务器还有其他中间件服务则不建议开启,否则会影响其他程序

    mysql> show variables like '%innodb_dedicated_server%';   --默认是OFF关闭,修改为ON打开
    +-------------------------+-------+
    | Variable_name           | Value |
    +-------------------------+-------+
    | innodb_dedicated_server | OFF   |
    +-------------------------+-------+
    1 row in set (0.02 sec)
    
  7. 死锁检查控制

    MySQL 8.0增加了一个新的动态变量 innodb_deadlock_detect,用于控制系统是否执行 InnoDB 死锁检查,默认是打开的。死锁检测会耗费数据库性能的,对于高并发的系统,我们可以关闭死锁检测功能,提高系统性能。但是我们要确保系统极少情况会发生死锁,同时要将锁等待超时参数调小一点,以防出现死锁等待过久的情况。

    mysql> show variables like '%innodb_deadlock_detect%';  --默认是打开的
    +------------------------+-------+
    | Variable_name          | Value |
    +------------------------+-------+
    | innodb_deadlock_detect | ON    |
    +------------------------+-------+
    1 row in set, 1 warning (0.01 sec)
    
  8. undo文件不再使用系统表空间

    在data目录下 默认创建2个UNDO表空间,不再使用系统表空间。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GhYV9V5F-1678203041984)(picture/性能调优/130201)]

  9. binlog日志过期时间精确到秒

    之前我们是在my.conf文件中配置expire_logs_days参数设置保留binlog多少天,而在8.0版本中,MySQL默认使用binlog_expire_logs_seconds参数,并精确到了秒

  10. 窗口函数(Window Functions):也称分析函数

    窗口函数与 SUM()、COUNT() 这种分组聚合函数类似,在聚合函数后面加上over()就变成窗口函数了,在括号里可以加上partition by等分组关键字指定如何分组,窗口函数即便分组也不会将多行查询结果合并为一行,而是将结果放回多行当中,即窗口函数不需要再使用 GROUP BY。

    详情可以看此小节的有道云笔记

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

    在8.0版本之前,默认字符集为latin1,utf8指向的是utf8mb3,8.0版本默认字符集为utf8mb4,utf8默认指向的也是utf8mb4。

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

    将系统表(mysql)和数据字典表全部改为InnoDB存储引擎,默认的MySQL实例将不包含MyISAM表,除非手动创建MyISAM表。

  13. 自增变量持久化

    解决了以前版本的一个bug

  14. DDL原子化

    InnoDB表的DDL支持事务完整性,要么成功要么回滚。

    -- 删除表时,此时t2表不存在 删除表报错不会回滚,t1表会被删除
    mysql> drop table t1,t2;
    ERROR 1051 (42S02): Unknown table 'test.t2'-- 而8.0版本 删除表报错会回滚,t1表依然还在
    mysql> drop table t1,t2;  
    ERROR 1051 (42S02): Unknown table 'test.t2'
    
  15. 参数修改持久化

    我们使用set global 或者set session设置的变量参数在mysql重启后会失效。

    MySQL 8.0版本支持在线修改全局参数并持久化,通过加上PERSIST关键字,可以将修改的参数持久化到新的配置文件(mysqld-auto.cnf)中,重启MySQL时,可以从该配置文件获取到最新的配置参数。

    mysql> set persist innodb_lock_wait_timeout=25
    

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

    {"Version": 1,"mysql_server": {"innodb_lock_wait_timeout": {      // key"Value": "25",				   //value"Metadata": {"Timestamp": 1675290252103863,"User": "root","Host": "localhost"}}}
    }
    

相关内容

热门资讯

安卓系统有什么便利功能 你有没有发现,安卓系统自从问世以来,就一直是手机界的“人气王”?它那丰富的功能,简直让人爱不释手。今...
网易棋牌安卓系统不能用 最近有没有小伙伴发现,网易棋牌在安卓系统上有点儿不给力呢?这可真是让人头疼啊!今天,就让我来给你详细...
什么软件只支持安卓系统,解锁移... 你知道吗?在手机应用的世界里,有些软件可是只对安卓系统情有独钟呢!它们就像那些只对某一款香水情有独钟...
信息延迟解决安卓系统,解锁安卓... 你有没有遇到过这种情况?手机里下载了新应用,却总是慢吞吞地加载,或者打开网页时总是卡壳,这可真是让人...
如何破解系统回到安卓,揭秘破解... 你是不是也和我一样,对安卓系统爱得深沉,但又偶尔想体验一下其他系统的魅力呢?比如,有时候想破解一下系...
安卓系统如何批量传图 你是不是也有过这样的烦恼:手机里的照片太多,想要一次性传给朋友或者备份到电脑上,却不知道怎么操作?别...
安卓跟苹果的系统版本,全面解析... 你有没有发现,手机更新换代的速度简直就像坐上了火箭呢?这不,最近安卓和苹果的系统版本又来了一场“大比...
安卓系统matter是什么,智... 你有没有听说最近安卓系统里有个新玩意儿叫Matter?没错,就是那个听起来有点神秘,又让人好奇不已的...
ios能转安卓系统吗,揭秘如何... 你有没有想过,你的iPhone换成安卓手机后,那些珍贵的iOS系统应用怎么处理呢?今天,就让我来带你...
小米7是不是安卓系统,安卓系统... 你有没有想过,小米7这款手机是不是运行在安卓系统上呢?这个问题听起来可能有点简单,但你知道吗,它背后...
安卓系统的手机搬家软件,一键迁... 你有没有想过,当你换了一部新手机,如何把旧手机里的照片、联系人、音乐、应用等宝贝全部搬到新手机上呢?...
苹果手机支持的安卓系统,探索跨... 你知道吗?最近有个话题在科技圈里可是炸开了锅,那就是苹果手机竟然支持安卓系统了!是不是觉得有点不可思...
鸿蒙系统安装安卓早期app,畅... 你有没有发现,最近手机界又掀起了一股热潮?没错,就是华为的鸿蒙系统!这款全新的操作系统一经推出,就吸...
安卓机耍苹果系统,跨界体验新篇... 你知道吗?在科技圈里,最近可是掀起了一股不小的风浪呢!那就是安卓机竟然开始“耍”苹果系统了。这可不是...
安卓手机修改系统界面,安卓手机... 你有没有想过,你的安卓手机界面其实可以变得超级个性?没错,就是那种别人一看就知道是你手机的感觉!今天...
安卓更新新系统很卡,安卓系统升... 亲爱的安卓用户们,最近是不是发现更新了新系统后,手机变得超级卡顿?别急,今天就来聊聊这个让人头疼的问...
安卓登录注册系统有哪些,功能解... 你有没有想过,每次打开安卓手机,那熟悉的登录注册界面背后,竟然隐藏着如此复杂的系统?今天,就让我带你...
安卓学生系统下载地址,开启智慧... 你有没有听说最近安卓学生系统火得一塌糊涂?这可是专为学生们打造的操作系统,听说功能强大,学习生活两不...
安卓原厂悦联系统,智能生活新体... 你知道吗?在手机界,有一个系统可是隐藏的宝藏哦!那就是安卓原厂悦联系统。它就像是一颗璀璨的明珠,镶嵌...
为何中国做不出安卓系统 你有没有想过,为什么咱们中国做不出像安卓那样全球知名的操作系统呢?这背后可是有着不少故事和原因哦!让...