曾几何时,我工作以后很长一段时间不知道该学些什么,月薪也稳稳地定格在了那里,我明白如果不做些什么,迟早会被应届生替换下去,因为道理很简单,你除了经验没有任何地方比他强,公司不会花两倍的钱来雇一个没什么区别的人。
直到我看了慕课网的《打造扛得住的MySQL数据库架构》,我好像重新找到了最初开始学习的激情和未来的发展方向。
课程一开始让我有种山重水复疑无路,柳暗花明又一村的感觉,打开了一个MySQL的新世界,我第一次知道MySQL还有存储引擎这个东西,而且它还是那么的重要,对于课程其中一部分的感悟分享给大家,篇幅有限不能倾囊道来,大家有条件的可以自己去看一下视频。
MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。而MySQL是支持自定义存储引擎的,所以除了第三方存储引擎,如果实力足够甚至可以自己开发出一套存储引擎。
我们来看一下MySQL常用存储引擎的特点:
在MySQL5.58版本以前,默认是使用MyISAM存储引擎的,也就是说5.58以前的MySQL默认是不支持事务的,而5.58以后呢,默认使用的是Innodb存储引擎,是支持事务的。Innodb实现事务的方式是通过Redo Log 和 Undo Log来实现的。
Redo Log:主要用来实现事务的持久性,存储的是已提交的事务。由两部分组成,一个是内存中的重做日志缓冲区,由innodb_log_buffer_size决定其大小,我们可以在MySQL命令行下使用show variables like 命令来查看,另一个则是重做日志文件是以id_logfile开头的文件,存储在MySQL的data目录下,它的数量是由innodb_log_files_in_group参数来决定的,同样可以使用show variables like命令来查看。
Undo Log:主要作用是实现MVCC(多版本并发控制),存储的是未提交的事务。当事务进行回滚的时候,就需要使用到Undo Log中的信息了。
Redo Log进行的是顺序写入,在数据库运行的时候,不需要对Redo Log进行读取操作,而Undo Log则是需要进行随机的读写的,从MySQL5.6版本开始,Undo Log可以独立于系统表空间的存在,如果条件允许,可以把它放置在固态硬盘中,能大大增加服务器的性能。
那么如何选择一个合适的存储引擎来优化MySQL的性能呢,首先要考虑一下如果需要事务的支持则最好使用Innodb,如果不需要使用事务,并且大部分都是插入和查询的操作,可以使用MyISAM,如果只是插入,很少查询的话Archive也是个不错的选择。
但是我们的数据库在生产环境中是需要进行备份的,前面所介绍的所有存储引擎中,只有Innodb有免费的在线热备份方案,要么就是收费的方案。而且崩溃后恢复数据,MyISAM损坏的几率要高于Innodb,所以即使不需要事务的支持,也要优先考虑Innodb,除非是某些比较特别的情况。
同时对于Innodb的事务有一个重要的参数Innodb_flush_log_at_trx_commit,它有三个选项:
0:每秒进行一次log写入cache,并flush log到磁盘,事务提交时不作任何操作
1[默认]:在每次事务提交以后,将log写入cache,并flush log到磁盘
2[建议]:事务提交提交以后,执行log数据写入到cache,并且每秒执行一次flush log到磁盘
第一种,容易丢失数据;第二种,安全高但性能最差;第三种,性能相对较高并且相对安全。需要注意的是,第一种设置MySQL进程崩溃就会至少丢失一秒数据。第三种则是提交到内存以后,准备写入磁盘时服务器死机,才可能丢失一秒的数据。
关于MySQL的优化还有大量的操作,比如我们操作系统参数的配置,MySQL默认参数的修改,硬件的选择,表的结构设计,索引的设计,查询优化,主从同步等等,这些能够从根本上解决MySQL的性能问题,打造真正扛得住的MySQL数据库,也为大家突破两万月薪保驾护航。
最后我想说的是:宝剑锋从磨砺出,梅花香自苦寒来。希望大家都能不断的学习进取,突破一个又一个的技术巅峰!
共同学习,写下你的评论
评论加载中...
作者其他优质文章