MySQL 5.7 新特性笔记

选取了部分觉得能用上的,完整版参考《MySQL管理之道,性能调优,高可用与监控》

一、 安全性

1. 默认开启SSL

在传输层加密网络连接,保障数据在网络传输的安全。

配置与使用

通过如下命令开启SSL加密,执行后会在/data目录下生成.pem文件,这就是ssl连接所需的文件。

mysql_ssl_rsa_setup

创建用户时需要指定该用户通过SSL连接。

create user username@'192.0.%' identified by 'xxx' require ssl;

用户登录按照普通方法即可

mysql -uxxx -p

 

2. 不再明文显示用户密码

MariaDB 10.1对binlog中的用户密码是不加密的

而MySQL 5.7会做加密处理。

 

3. sql_mode的改变

5.6中sql_mode默认为空,5.7中为strict_trans_tables严格模式,错误数据不能插入且事务回滚。

 

二、 InnoDB存储引擎提升

1. (在线)修改索引名

5.7之前mysql是不支持改索引名的,只能drop后重建。

alter table mytbs rename index ind_old to ind_new;

 

2. 加长varchar字段不锁表

例如将varchar(60) 改为varchar(80),既不用拷贝数据也不用锁表。

但有如下限制:

  • 字段属性>=varchar(256)时,256是字节数(UTF8占3字节)会锁表
  • 改短varchar字段会锁表,例如varchar(80) 改为varchar(60)
  • 仅针对varchar,int,char类型不适用
  • online DDL期间会降低数据库吞吐量
  • 修改期间该表写入数据量超过innodb_online_alter_log_max_size(默认128M)会报错,当前所有未提交dml事务回滚。

online DDL的原理是在ddl操作执行的同时将对表的dml操作日志写入缓存中,待ddl完成后将dml操作应用到对应表上。缓存的大小即由innodb_online_alter_log_max_size参数来指定,如果该参数设置过大、对表的写操作又很多,ddl完成后dml操作可能要应用很久。

补充:

  • 增加、删除普通字段一般不锁全表
  • 删除主键锁全表
  • 执行alter table前如果有对该表的慢查询,须等慢查询执行完才会执行alter table语句,此时alter table语句会等待mdl锁并阻塞后面dml语句。

鉴于限制过多,对大表执行DDL操作还是建议业务低峰期进行,或者使用pt-online-schema-change工具。

 

3. buffer pool预热改进

5.6引入了一个新特性来快速预热buffer pool,只需在my.cnf中设置

innodb_buffer_pool_dump_at_shutdown=1 # 在正常停库时将热数据dump到本地磁盘ib_buffer_pool文件中(kill mysql进程是不会dump的)
innodb_buffer_pool_load_at_startup=1 # 起库时将热数据加载到内存

5.7引入了一个新参数 innodb_buffer_pool_dump_pct 改进此新特性,允许控制每个缓冲池最近使用页的百分比来导出,避免导出所有页占用过多磁盘,默认值为25%。

 

4. 在线调整buffer pool大小

修改innodb_buffer_pool_size参数不再需要重启mysql生效,但是调整期间用户请求会被阻塞直到调整完毕,建议在业务低峰期做。

set global innodb_buffer_pool_size=256*1024*1024 -- 256M

 

 

5. 在线收缩undo log物理文件空间

undo log默认保存在ibdata1文件里,随着业务进行会越来越大。5.6支持将其移动到单独表空间,但不支持收缩,直到5.7版本才支持在线收缩undo log物理文件空间。

以下undo相关参数需要在安装mysql时指定,数据库创建后指定会报错。

 

6. 支持创建通用表空间

可以指定某些表放在同一表空间中,需开启以下参数

innodb_file_per_table=1

 

7. 死锁信息可以记入错误日志(5.6也支持)

死锁信息可执行以下命令查看

show engine innodb status\G;

或在my.cnf中配置

innodb_print_all_deadlocks=1

 

三、 功能提升

  • 支持用json格式存储数据

  • 支持一张表上有多个DML触发器

  • Ctrl+C组合键不会退出客户端,而仅中止当前命令

  • 可将错误日志打印到系统日志,启动mysql服务或客户端连接时加 --syslog参数即可

  • 可查看update、delete语句执行计划(5.6开始支持,之前只支持explain select语句)

  • 提供审计功能(5.6/5.7企业版支持,需安装审计插件)

 

四、 性能提升

1. innodb效率及并发性改进

消除innodb内核原有的线程争用和互斥锁现象,QPS约为5.6的3倍、TPS约为5.6的2倍。

 

2. 支持函数索引

可在表中使用虚拟列,并为虚拟列创建索引。

 

3. 针对子查询采用半连接优化

MySQL的子查询一直以性能差著称,常用的解决方案是用关联代替子查询。从5.6开始,子查询有了强劲优化,不改变原有sql的情况下,优化器能自动将子查询转为关联查询。

MySQL 5.5版本会先扫描外表中的所有数据,每条数据传到内表与之关联,如果外表很大,性能会很差。5.6采用半连接优化后,先过滤内表数据再跟外表进行关联,效率大大提高。

5.5的子查询执行计划是将in重写为exists,5.6之后则是将in和exists重写为join。

半连接子查询优化默认开启,可通过以下语句查看:

show variable like 'optimizer_switch'\G;

但是,半连接优化只针对查询,update、delete性能依然很差,仍旧是先查外表再关联内表。

 

4. 优化in条件表达式

在5.6中执行以下查询,即使id是主键、k是索引也只能走全表扫描。

select * from sbtest where (id,k) in ((11,0),(12,0));

但在5.7中,可以走索引,优化器已自动将其改写为

select * from sbtest where (id=11 and k=0) or (id=22 and k=0);

 

5. 优化union all

5.7版本中union all不再创建一张临时表,在执行大的联合查询时会减少IO开销,但对union和在最外层使用order by无效。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hehuyi_In

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值