找到一份合适的工作,就像在工作的八小时之内有了一个心仪的恋人。
老张我呢,原来在上学那会儿,不是特别爱学习,本人长得呢也特别帅(现在做了技术可惜了哈哈!)所以特招漂亮女孩的喜欢,当然自己也特别喜欢和她们谈恋爱啦,那感觉老甜蜜了呢。也算得上是情感专家。但是最后都没啥好结果,弄得我今后都不再相信爱情了。
于是我开始反思自己,到底是哪里出了问题,刚开始谈恋爱的时候,两人都感觉特别好,可是随着时间地流逝,感情就特别容易出现裂痕。原来是有一种叫做新鲜感的东西,在作祟。新鲜感只是说在你们还不是很了解对方的情况下才有的,时间一长,两人之间都彼此太熟悉了,就缺失了爱情中需要的火花元素,化学反应一旦不在,自然任何一次恋爱的开始也就意味着是分手的倒计时。
那如何保持这种新鲜感呢,时间久了,情侣之间就只能说是保鲜,需要偶尔给对方一点小小的惊喜和浪漫。
生活中谈恋爱是这样,那研究技术也同样如此。一沉不变的技术知识,时间长了,我们都会觉得枯燥无味,索然无趣。需要新鲜的血液进入到我们的神经中枢,激发我们对于求知欲的渴望。
今儿跟大家梳理一下MySQL数据库中 5.7这个版本的新特性,让那些平时只顾着工作,没时间去研究新知识的同学,可以看到数据库的新功能,新特性,今后有利用应用到生产中,更便于我们开展工作。让我们把这个恋爱谈得更长久,更甜蜜。
目前互联网公司,线上mysql用的最多的版本是mysql5.5,5.6,5.7。先看下三个版本的性能对比图:
OLTP READ ONLY
MySQL 5.7比MySQL5.6 快近似于2倍
比MySQL5.5快近似于3倍
OLTP READ WRITE
MySQL5.7比MySQL5.6快近似于1.5倍
比MySQL5.5快近似于2.5倍
MySQL数据库,在5这个版本上待了10年之久,server层没有太大的变化,主要是存储引擎层的改变。也就是目前最火的Innodb存储引擎,无论从它的功能上、还是性能上,都有所提高。
一. 先从Innodb角度介绍
Innodb的增强分为三大部分:
1.功能提升
Online Alter table;
Innodb_buffer_pool online change;
原子写特性的检测;可以关闭double_write
Innodb buffer pool dump
2.性能提升
Innodb临时表的DDL性能提升;临时表不需要再记录redo log;
Read Only性能上面的提升;
page cleaner线程数量上的增加,提升innodb_page_cleaners的效率
3.其他点提升
截断undo特性;
支持分区表的Transportable Tablespaces功能
下面详细逐一介绍
Online Alter table
MySQL 5.7支持重命名索引和修改varchar的大小,无需table-copy。这两项操作在之前的版本中,都需要重建索引或表。适用于各引擎。
例如如下: ALTER TABLE t1 ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(255);
但存在限制,即只支持0~255字节内的或者255以上字节间的增加,也就是说若从254增到256时不能使用INPLACE算法,必须使用COPY算法,否侧报错。这是因为0~255内的VARCHAR值需要一个额外的字节来编码,而256以上的VARCHAR值需要两个字节来编码。另外使用INPLACE算法缩小VARCHAR的ALTER TABLE也是不支持的,必须用COPY算法。
官文可见:http://dev.mysql.com/doc/refman/5.7/en/alter-table.html
动态修改Buffer Pool
动态调整innodb_buffer_pool_size大小,且不会消耗太高的代价。新增配置参数innodb_buffer_pool_chunk_size用来设置chunk的大小,新引入chunk的概念,每个chunk默认是128M,以及新增状态参数Innodb_buffer_pool_resize_status用来监视buffer pool的resize过程 。
TIPS: 从小改到大基本对服务没有什么影响,从大到改到小,就是多了一步需要释放内存,但可以忽略到影响。
Innodb buffer pool dump
新增参数innodb_buffer_pool_dump_pct,支持仅dump每个缓冲池中最热的 m% 页,即为最热的数据page。如果在业务高峰时发生宕机,数据库在恢复重启时,可以快速把热数据导入内存,避免血崩。load操作改进,减少了对用户活动的破坏性,减少IO资源占用。
默认如下两个参数都是开启的状态
innodb_buffer_pool_dump_at_shutdown=on
innodb_buffer_pool_load_at_startup=on
在系统负载过高的时候,会根据innodb_io_capacity这个参数来设置 dump的速度,io压力不大的时候可以适当调大一些。
page cleaner数量的增加
支持多个page cleaner线程从buffer pool中刷新脏页,可以适当调整innodb_page_cleaners配置线程数,其默认值为1。
截断undo特性
原来undo log在ibdata1中,多余的undo log容易使共享表空间文件暴涨,占用过多的磁盘空间。mysql5.6之后可以把undo log从ibdata1中分离出来,成为独立的表空间 。5.7版本
通过新增的配置选项innodb_undo_log_truncate启用,并由参数innodb_max_undo_log_size指定截断阈值,当undo log超过阈值时截断已回收的undo log,防止磁盘空间紧张。
官文可见:http://dev.mysql.com/doc/refman/5.7/en/truncate-undo-tablespace.html
二. 复制(replication)功能的提升
并行复制 :基于logical-clock(5.7引入)一个组提交内事务都可以并行,可以达到接近主库并发效果。
进入prepare状态的事务都可以在slave并行应用。
多源复制 :支持由多个master向一个slave复制。用于将多个服务器备份到单个服务器上。可用于异地容灾,集中备份。
增强半同步 :是在mysql5.5半同步复制基础上的增强,在集群架构切换时可以保证数据的一致性。由after_commit变成了after_sync,也提高了复制的效率。
组复制 :有点像Oracle里面的RAC集群,可以保证多节点并行写入数据。比较类似于PXC架构。个人建议:目前不是很成熟,先不建议使用。
三 . SYS schema功能的增强
sys schema是MySQL 5.7.7中引入的一个系统库,包含了一些视图和函数。不同于之前的版本,需要通过DBA的经验之谈去排查数据库的问题,我们可以通过sys schema了解到,哪些语句使用了临时表,哪个用户请求了最多的io,哪个线程占用了最多的内存,哪些索引是无用索引。
查看数据库中的冗余索引的SQL语句 : select * from sys.schema_redundant_indexes;
查看数据库中的索引使用情况语句 :select index_name,rows_selected,rows_inserted,rows_deleted,rows_updated
from schema_index_statistics where table_schema='DB_name' and table_name='table**'
and index_name='**'
;
查看数据库的未使用到的索引 :
select * from sys.schema_unused_indexes;
查看数据库IO写数据文件的最多10条(TOP 10) :select * from sys.x$io_global_by_file_by_bytes order by total_written desc limit 10;
查看实例消耗的内存 :select * from sys.memory_global_total;
四.优化器的提升:
mysql5.7之前,mysql的优化器很垃圾,是性能瓶颈点。5.7之后改善了很多功能。
UNION ALL查询的优化。尽量避免UNION ALL语句创建临时表,并提高了响应速度。
新增了更多的HINTS,并提供新的HINTS语法 。
EXPLAIN FOR CONNECTION 。能获取一个指定会话中正在执行的SQL语句的执行计划,而不需要找到SQL语句。
排序效率上面的提升。
IN子查询的提升。
JSON格式的输出结果中,还能看到执行计划的代价信息。
五.设置查询sql的超时(max_execution_time)
MySQL 5.7.4刚引入名字是max_statement_time,后来改成max_execution_time。这个参数很实用,是一种自我保护的措施。防止因为一条sql语句的长时间执行,导致数据库血崩。
六.安全性的增强
mysql_install_db弃用了,改用mysqld加–initialize或–initialize-insecure。
不再使用password字段,使用authentication_string替代 。
MySQL 5.7开始,root用户的密码不再是空的了,而是随机产生一个,保存于error log,初次登录需使用密码并修改密码。
mysql.user表新增plugin列,且若某账户该字段值为空则账户不能使用。
七.sql_mode参数
由之前的NO_ENGINE_SUBSTITUTION变成为严格模式STRICT_TRANS_TABLES SQL mode 。
如出现sql书写有问题的,直接抛出错误。不会再出现截断等现象。也不能在grant的过程中,直接创建用户了。
以上就是老张为大家梳理的mysql5.7的一些新的特性。
生活中恋爱还是要谈,爱情还是要相信,工作中技术还是得不断学习,提高自己,给自己上发条,才能进步得更快。新鲜感这个东西不要一味地要求别人带给你,我们也要学会创作出属于我们自己的浪漫与新鲜的feel!
superZS(老张)祝大家爱情、事业双丰收!