与技术谈一场永不分手的恋爱
找到一份合适的工作,就像在工作的八小时之内有了一个心仪的恋人。
老张我呢,原来在上学那会儿,不是特别爱学习,本人长得呢也特别帅(现在做了技术可惜了哈哈!)所以特招漂亮女孩的喜欢,当然自己也特别喜欢和她们谈恋爱啦,那感觉老甜蜜了呢。也算得上是情感专家。但是最后都没啥好结果,弄得我今后都不再相信爱情了。
于是我开始反思自己,到底是哪里出了问题,刚开始谈恋爱的时候,两人都感觉特别好,可是随着时间地流逝,感情就特别容易出现裂痕。原来是有一种叫做新鲜感的东西,在作祟。新鲜感只是说在你们还不是很了解对方的情况下才有的,时间一长,两人之间都彼此太熟悉了,就缺失了爱情中需要的火花元素,化学反应一旦不在,自然任何一次恋爱的开始也就意味着是分手的倒计时。
那如何保持这种新鲜感呢,时间久了,情侣之间就只能说是保鲜,需要偶尔给对方一点小小的惊喜和浪漫。
生活中谈恋爱是这样,那研究技术也同样如此。一沉不变的技术知识,时间长了,我们都会觉得枯燥无味,索然无趣。需要新鲜的血液进入到我们的神经中枢,激发我们对于求知欲的渴望。
今儿跟大家梳理一下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)功能的提升
并行复制
多源复制
增强半同步
组复制--MGR
并行复制:基于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(老张)祝大家爱情、事业双丰收!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
清算/报表/日终跑批程序之性能优化案例(一)
前言 不知不觉,技术人生系列·我和数据中心的故事来到了第五期。小y又和大家见面了! 前几期主要发了一些TroubleShooting的案例分享,其实小y最擅长的是性能优化,所以从这期开始,小y会陆续的分享更多的数据库性能优化案例。 进入正题,如果您的日终跑批/清算/报表等程序时快时慢,或者从某一天以后就一直变慢,作为运维DBA或开发的您,会怎么下手?还有,除了解决问题外,你要如何解答领导最关心的一个问题,“为什么现在有问题,但是以前没有问题呢”! 小y今天要和大家分享的就是这样一个性能问题的分析和解决过程。 你们的点赞和转发就是小y继续坚持分享的动力。 另外,前阵子有部分朋友问,小y所在的团队是否可以提供对外的第三方Oracle服务,答案是YES! 有兴趣的朋友可以加一下小y的个人微信,微信号是 shadow-huang-bj,希望可以交到更多的朋友,并帮助到更多有需要的人。 Part 1 问题来了 小y,有空么?一会一起看一个报表的性能问题。 有个SQL语句一周前开始,性能急剧恶化,执行时间从10分钟以内变成了10个小时以上。 刚在客户现场做完Oracle的培训,问题来的正是时候,刚...
- 下一篇
shell脚本执行超时怎么办?
在shell里会有一种不太常见的情况,就是脚本有时候会出现超时的现象。一般来说遇到这种问题,我们都会简单粗暴的采用下面这种脚本来当“超时看门狗“: #!/bin/bash ./$1&#这里设定后台运行的第一个参数 pid=$!#最后一个运行的process的PID值 sleep$2&&kill-9$pid&#如果超过了$2的值的话,就会把那个PID干掉 这个脚本搭配两个变量使用的话,监控一点小代码还算OK,但是它的逻辑还是比较粗糙,比如如果在这个脚本执行的时候,又有了一个新的process在后台启动,那么kill掉的就是新的process,而本应该停止的脚本还是在后台肆无忌惮的跑着。 为了不滥杀无辜,所以遇到这种情况,就要使用timeout命令,具体的用法请自行#man timeout,这个命令在centos 6里就是自带的。 假设我们要ping www.baidu.com ,同时要求“若超过了5秒没有反应,就停止这个任务”。那么就是用命令:#timeout5spingwww.baidu.com,效果如图: 从26秒到31秒,的确达到了5秒就跳出的效果。...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境