(一)学习前言
两年前,在安装mysql数据库时,一顿操作猛如虎,一看结果250。
那会儿,学mysql这玩意可烦躁:下载了五六个版本的mysql客户端,无论是免装版还是安装版都安装不上,各种插件、技巧也解决不了该版本内部所不知道的bug,直到目前依然是一个让人抓狂的悬案。
其实,大多数人刚开始学习mysql都是这样子的:
1】安装mysql客户端程序,理解一些基本概念,就是系统的存储一些数据的仓库
2】cmd命令行中进入数据库操作界面,修改权限密码等,创建数据库、创建表
3】学习数据库基本语法:数据类型、函数、运算符号、增删改查、索引、图表,写几个实例练习
……
前辈告诉我们,数据库只要会上面这些CRUD操作就可以了,而在实际工作中,更大程度上是封装好了的增删改查,在直接操作数据库语句和编码程序之间做了一个隔离,很多时候只能使用被隔离后的java语句进行增删改查操作,至于为什么,那会儿也说不出个所以然。
两年多开发时间里,数据库完全就是一个黑盒子,仓库里面怎么样、组成结构也根本不知道,或许也不需要了解,毕竟那会儿有太多东西需要学习掌握,直到有行业新人问自己数据库的一些深层次问题,才发觉,数据库里面的水很深,如果想在技术这一路途爬得更高,决不能满足于某些前辈的“胡说八道”!
随着职位的提升和工作任务的加重,数据库的优化和深层次的学习提上日程。首先看问题的方式改变了,学习的要点也不同了,过去只是应付着工作凑合着使用,只要不出问题就可以了,但是当自己作为项目负责的一部分以后:自己就要把项目运行最优化,大家都退缩是做不好的,必须要学习深层次的知识,使项目工程良好的运转起来。
例如一些数据库经典面试问题:mysql如何优化?innodb的事务与日志的实现方式?你是如何监控你们的数据库的?你们的慢日志都是怎么查询的?MySQL的复制原理以及流程?……
上面这些看着让人烦躁却又不得不学的东西,另外,还有更多数据库知识需要学习:为何要封装?如何更好的封装?分表的意义?索引的设计,冗余数据字段,临时数据的缓存?……
这些都是一个系统的数据库优化方式,因为在CPU多核化高效化的当下,阻碍程序运作效率的更多是IO(网络IO和数据库存取IO)
前辈推荐了两本书《Mysql性能优化和架构设计》、《MySQL内幕:InnoDB存储引擎》。
为了啃下这两本书,个人先做了一些基础准备,再看一遍mysql的基础入门典册《mysql必知必会》,然后是《Nosql精粹》,因为上面这两本书在没有一定心理准备前提下,确实比较抽象,这样很容易导致阅读的时候心里排斥、速效低下。
总体上说《Mysql性能优化和架构设计》是Mysql深入学习的总览,书不算厚,三百来页,章节结构清晰,内容还合适,实例相对少一些。
而《MySQL技术内幕:InnoDB存储引擎》是Mysql单一个方向Innodb存储引擎的深入学习分析书籍,没有一定的数据库使用、操作实践基础学习起来会显得抽象麻木,但是也是中级程序员迈入高级程序员的必备书籍。
(二)书本重点记录
按照学习顺序,先看了《Mysql性能优化和架构设计》,以下为内容概要简介。本书共分三篇:基础篇、性能优化篇、架构优化篇
第一篇:基础篇
复习恢复mysql数据库的一些基础知识,数据库服务构成模块、常用存储引擎等。
第一章:基础简介
Mysql的诞生与成长历程,特点与适用场景简介。
第二章:架构组成
Mysql的物理文件组成:日志文件、数据文件、Replication相关文件
Mysql Server系统架构组成:逻辑模块和各模块配合工作
第三章:Mysql存储引擎简介
Mysql常用存储引擎简介:MyISAM、Innodb、NDBCluster存储引擎重点介绍。其他存储引擎Merge、Memory、BDB、CSV等存储引擎的设计与实现、功能特色简介。
第四章:Mysql安全管理
数据库系统安全因素主要有:外网、主机、数据库、代码四重因素
Mysql权限系统的四个级别以及设计方案原则,访问授权策略和安全设置数据库主机的注意事项
第五章:Mysql备份和恢复
常见几种不同阶段的备份设计方案(如物理备份和逻辑备份等)
第二篇:性能优化篇
我们很大一部分人都一致认为一个数据库应用系统的性能瓶颈最容易出现在数据的操作方面,而数据库应用系统的大部分数据操作都是通过数据库管理软件所提供的相关接口来完成的,所以数据库管理软件也就很自然的成为应用系统的性能瓶颈,但其实并不是这样。
很多人都认为性能是在通过编写代码(程序代码或者是数据库代码)的过程中优化出来的,其实这是一个非常大的误区。真正影响性能最大的部分是在设计中就已经产生了的,后期的优化很多时候所能够带来的改善都只是在解决前妻设计所遗留下来的一些问题而已,而且能够解决的问题通常也比较有限。
第六章: 影响MysqlServer性能的相关因素
常见影响因素:1)外部:不合理需求、不合理系统设计;
2) 内部 :冗余数据:二进制多媒体数据;流水队列数据;超大文本数据;
Query语句、Schema设计、硬件环境对系统性能的影响
第七章:Mysql锁定机制
为了保证数据的一致完整性,任何一个数据库都存在锁定机制。锁定机制的优劣直接影响到一个数据库系统的并发能力和性能,所以锁定机制的实现也就成为了各种数据库的核心技术之一。
该章主要对 MySQL 中两种使用最为频繁的存储引擎 MyISAM 和 Innodb 各自的锁定机制进行较为详细的分析,其中 Mysql各存储引擎使用了三种类型的锁定机制(行级、页级和标级锁定)他们各有对应的使用场景和优缺点。
第八章:Mysql 的Query的优化
根据Query 语句的优化思路和原则进行优化设计
引入 join实现原理与优化方案
除了常规的 Join 语句之外,还有一类 Query 语句也是使用比较频繁的,那就是 ORDER BY,GROUPBY 以及 DISTINCT 这三类查询。
第九章:Mysql数据库Schema设计的性能优化
通过这一章的内容,作者其实希望能够让大家明白一个道理,“数据库系统的性能不是优化出来的,更多的是设计出来的”。数据库 Schema 的设计并不如很多人想象的那样只是一个简单的对象对应实现,而是一个系统工程。要想设计出一个既性能高效又足够满足业务需求,既逻辑清晰又关系简单的数据库Schema 结构,不仅仅需要足够的数据库系统知识,还需要足够了解应用系统的业务逻辑。
第十章:MysqlServer的性能优化
通过源码安装的最大特点就是可以让我们自行调整编译参数,最大程度的定制安装结果。作者希望读者自己在通过源码编译安装中的一些优化实践学到一些有用的东西。
通过参数设置来进行性能优化所能够带来的性能提升可能并不会如很多人想象的那样产生质的飞跃,除非是之前的设置存在严重的不合理情况。我们不能将性能调优完全依托在通过 DBA 在数据库上线后的参数调整之上,而应该在系统设计和开发阶段就尽可能减少性能问题。当然,也不能否认参数调整在某些场景下对系统性能的影响比较大,但毕竟只是少数的特殊情况。
第十一章:常用存储引擎优化
每一种存储引擎都有各自的特长,也都存在一定的短处。如何将各种存储引擎在自己的应用环境中结合使用,扬长避短,也是一门不太简单的学问。本章选择最为常用的两种存储引擎MyISAM、Innodb存储引擎进行针对性的优化建议。
第三篇:架构设计篇
MySQL 数据库之所以在互联网行业如此火爆,除了其开源的特性,使用简单之外,还有一个非常重要的因素就是在扩展性方面有较大的优势。其不同存储引擎各自所拥有的特性可以应对各种不同的应用场景。其 Replication 以及 Cluster 等特性更是提升扩展性非常有效的手段。
第十二章:Mysql可扩展设计的基本原则
数据库扩展主要有两个方面,横向和纵向扩展。横向是指通过增加处理节点的方式提高整体处理能力,实际一点就是通过增加机器来增加整体的处理能力; 纵向是指增加当前处理节点的处理能力来提高整体的处理能力,说白了就是通过升级现有服务器的配置,比如增加内存,增加CPU,增加存储系统的硬件配置或者是直接更换为处理能力更强的服务器和更为高端的存储系统。
本章正是对横向扩展还是纵向扩展做一个优缺点分析,让读者可以选择一个适合自己业务的设计方案。
第十三章:可扩展性设计之Mysql Replication
MySQL Replication 是 MySQL 非常有特色的一个功能,他能够将一个 MySQL Server的 Instance 中的数据完整的复制到另外一个 MySQL Server 的 Instance 中。
在实际应用场景中, MySQL Replication 是使用最为广泛的一种提高系统扩展性的设计手段。众多的 MySQL 使用者通过 Replication 功能提升系统的扩展性之后,通过简单的增加价格低廉的硬件设备成倍甚至成数量级的提高了原有系统的性能,是广大 MySQL 中低端使用者最为喜爱的功能之一,也是大量 MySQL 使用者选择 MySQL 最为重要的理由之一。
第十四章:可扩展性设计之数据切分
这一章主要介绍数据的切分横向和纵向的划分介绍与实践案例。
通过数据切分技术将一个大的 MySQL Server 切分成多个小的 MySQL Server,既解决了写入性能瓶颈问题,同时也再一次提升了整个数据库集群的扩展性。不论是通过垂直切 分 ,还是水平切分,都能够让系统遇到瓶颈的可能性更小。尤其是当我们使用垂直和水平相结合的切分方法之后,理论上将不会再遇到扩展瓶颈了。
第十五章:可扩展性设计Cache和Search的利用
前面章节部分所分析的可扩展架构方案,基本上都是围绕在数据库自身来进行的,这样是否会使我们在寻求扩展性之路的思维受到“禁锢 ” ,无法更为宽广的发散开来。这一章,跳出完全依靠数据库自身来改善扩展性的问题,将数据服务扩展性的改善向数据库之外的天地延伸!
数据库只是存储数据的一种工具,其特殊性只是能将数据持久化,且提供统一规范的访问接口而已。除了数据库,其实我们还可以很多其他的数据存储处理方式,结合各种数据存储处理方式,充分发挥各自的特性,扬长避短,形成一个综合的数据中心,这样才能让系统的数据处理系统的扩展性得到最大的提升,性能得到最优化。
第十六章:MysqlCluster
MySQL Cluster 是一个基于 NDB Cluster 存储引擎的完整的分布式数据库系统。不仅仅具有高可用性,而且可以自动切分数据,冗余数据等高级功能。本章通过对 MySQL Cluster 的了解来寻找其在可扩展设计方面的优势。
第十七章:高可用设计之思路以及方案
本章内容针对如何构建一个高可用的 MySQL 数据库系统来介绍各种解决方案以及方案之间的比较。
本章重点对 MySQL 自身具备的两种高可用解决方案以及 MySQL 官方推荐的 DRBD解决方案做了较为详细的介绍,同时包括了各解决方案的利弊对比。
第十八章:高可用设计之Mysql监控
一个经过高可用可扩展设计的 MySQL 数据库集群,如果没有一个足够精细足够强大的监控系统,同样可能会让之前在高可用设计方面所做的努力功亏一篑。本章正是让我们学习如何能够尽可能多的提前预知系统可能会出现的异常状况,即使没有及时发现将要发生的异常,也要在异常出现后的第一时间知道系统已经出现异常。
(三) 学习与改进
再次看完这本书,发现自己对数据库了解得太少了,除了一些mysql的基础知识,其他什么一些规范都扔掉,大概这也是长期使用系统框架封装好的java去进行数据访问所造成的一些弊端,还有缺少线上项目实战,只有经历过线上项目操作才能发现一些隐蔽的问题,才能提升自己。
接下来一段时间,需要更深一层的学习数据库,主要是系统全面的学习:
1】数据库基础知识复习,概念更新学习;
2】mysql数据库常见优化方式(深入底层分表、索引等各种优化),备份与监控等线上问题处理学习;
3】分布式数据库学习,常见数据库引擎深度学习;
————————
2018.6.20