选取了部分觉得能用上的,完整版参考《MySQL管理之道,性能调优,高可用与监控》
在传输层加密网络连接,保障数据在网络传输的安全。
配置与使用
通过如下命令开启SSL加密,执行后会在/data目录下生成.pem文件,这就是ssl连接所需的文件。
mysql_ssl_rsa_setup
创建用户时需要指定该用户通过SSL连接。
create user username@'192.0.%' identified by 'xxx' require ssl;
用户登录按照普通方法即可
mysql -uxxx -p
MariaDB 10.1对binlog中的用户密码是不加密的
而MySQL 5.7会做加密处理。
5.6中sql_mode默认为空,5.7中为strict_trans_tables严格模式,错误数据不能插入且事务回滚。
5.7之前mysql是不支持改索引名的,只能drop后重建。
alter table mytbs rename index ind_old to ind_new;
例如将varchar(60) 改为varchar(80),既不用拷贝数据也不用锁表。
但有如下限制:
online DDL的原理是在ddl操作执行的同时将对表的dml操作日志写入缓存中,待ddl完成后将dml操作应用到对应表上。缓存的大小即由innodb_online_alter_log_max_size参数来指定,如果该参数设置过大、对表的写操作又很多,ddl完成后dml操作可能要应用很久。
补充:
鉴于限制过多,对大表执行DDL操作还是建议业务低峰期进行,或者使用pt-online-schema-change工具。
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%。
修改innodb_buffer_pool_size参数不再需要重启mysql生效,但是调整期间用户请求会被阻塞直到调整完毕,建议在业务低峰期做。
set global innodb_buffer_pool_size=256*1024*1024 -- 256M
undo log默认保存在ibdata1文件里,随着业务进行会越来越大。5.6支持将其移动到单独表空间,但不支持收缩,直到5.7版本才支持在线收缩undo log物理文件空间。
以下undo相关参数需要在安装mysql时指定,数据库创建后指定会报错。
可以指定某些表放在同一表空间中,需开启以下参数
innodb_file_per_table=1
死锁信息可执行以下命令查看
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企业版支持,需安装审计插件)
消除innodb内核原有的线程争用和互斥锁现象,QPS约为5.6的3倍、TPS约为5.6的2倍。
可在表中使用虚拟列,并为虚拟列创建索引。
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性能依然很差,仍旧是先查外表再关联内表。
在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.7版本中union all不再创建一张临时表,在执行大的联合查询时会减少IO开销,但对union和在最外层使用order by无效。