数据库相关的知识,看了《高性能MySQL》和《数据库系统实现》两本。两本书综合看效果更好。 《高性能MySQL》从使用的角度入手,《数据库系统实现》从原理的角度入手。之前学习数据库相关的知识时有个执念,必定要弄明白它是怎么实现的,就直接买了一个《MySQL内核:Innodb存储引擎》,结果看不懂,束之高阁。程序员
数据库的知识,我的以为以下的顺序比较合理。算法
《数据库系统实现》在第二章就单独用一章的篇幅讲解磁盘的存储原理。这是由于计算机内置组件中具有持久存储能力的只有硬盘,软件屈从于硬件。所以理解磁盘的存储特色才能理解软件设计背后的逻辑。磁盘存储有以下的特色:数据库
特性A:相比CPU的延迟,磁盘延迟很是很是大。 在《性能之巅》中有作过对比,对于3.3GHz的CPU, 一个指令周期为0.3ns;机械硬盘一次I/O的延迟为1~10ms。这个差距有多大,若是一个CPU指令周期为1s, 那么机械硬盘一次I/O的延迟为1~12个月。真是等到花儿都谢了。数组
特性B:磁盘是块设备,每次写入都是按块来的。一般一个块为512byte。即便用硬盘,得注意不能用轮船只运输一个土豆到美国
。网络
上述的特性不只影响了数据库的设计,更是深入影响了操做系统的设计,例如page cache
数据结构
数据库的操做基本上就是更高阶的读写: select 和 delete/update 是咱们使用数据库频率最高的操做了。 因此,数据库解决的核心问题就是如何组织数据实现高性能的读写。 架构
###事务
高性能无法忽略掉并发,在并发读写场景下,就会出现数据一致性的问题。因此事务
就用来解决数据一致性的问题了。并发
默认每条SQL语句都是一个事务, 能够手动设置提交点改变这一规则负载均衡
在MySQL中,事务的隔离级别有4种。这4种其实不用死记硬背,能够从应用场景推导出来。ide
事物A修改了记录a, 没有提交;事务B读取表,读取到了该事务。 这就是未提交读
。 若是咱们本身设计数据库,在原数据上修改字段,若是没有其余手段的控制,并发状况下就会出现这种状况。因为读取到了脏数据,也称为脏读。这里咱们也能够将事务换一个熟悉的概念:线程来理解
针对上面未提交读
的问题,若是将改动保存在事务的做用域内部,那么未提交的数据就不会影响其余事务。 这种隔离级别就是提交读。也叫不可重复读。由于失误内部两次执行可能获得不同的结果。
提交读面临的不可重复读的问题,在可重复读
隔离级别下能够避免。它能保证一个事务屡次读取同一条记录不会改变。固然,若是事务内部改变了该记录,另说。这个级别带来的另外一个问题就是[幻读]。 这个很好理解: 2个事务。事务A 读取记录不存在就写入;事务B写入记录。 事务A有可能出现写入失败的状况。
将事务顺序执行。性能最低的作法。
一般查询数据有两种典型的场景: 等值查询
和区间查询
。 即select * from table where field=a
或者 select * from table where field between a and b
。 若是没有索引,惟一的作法就是全表扫描。这是一种大海捞针的作法。 程序员通常关注两个点: 问题在哪和怎么优化。 对于等值查询,最好的优化方式就是hash了。对于区间查询,不是hash算法的用武之地,由于它有个隐藏的逻辑: 排序。 一般,具有排序功能的数据结构有: 排序后的数组,链表。 跳跃表。AVL树,红黑树,B树,B+树。
为何选择B+树?
性能就是响应时间。 性能问题的排查思路是top-down的方式:
性能问题须要更可能是操做系统相关的知识。
这个是MySQL的杀手锏。若是没有复制功能,MySQL不可能这么流行。 复制引伸出来的特性: 读写分离,负载均衡,高可用,故障切换, 备份, 测试升级。都是滥大街的概念。
复制的实现方式:基于行的复制和基于日志的复制。
可扩展性就是经过增长资源来提高系统容量的能力。好比MySQL经过读写分离,每新增一个Slave节点,数据库层面的读并发能力有所提高。固然因为系统分层,每一个层级都支持可扩展性,整个系统才具有可扩展性。
数据库层级的扩展经常使用策略就是分库分表这些策略了。
另外,可扩展性跟系统性能是两回事。 好比Hive性能较低,可是不影响其可扩展性。
高可用本质上就是更少的宕机时间。 若是从计算机的视角来看待人,人的可用性通常只有50%,按天天8小时工做制,人的可用性只有33%。
利用top-down的思路, 实现高可用,只有两种办法: 提高平均失效时间间隔
, 简而言之,就是让系统两次宕机中间的时间间隔越长越好;下降平均恢复时间
, 简而言之,就是出了故障修复时间越短越好。 因此,高可用更多的是架构层面的东西, 好比MySQL的互为主备,负载均衡。
备份是个容易被忽略的话题。属于那种平时不待见,关键时刻须要扛雷。 备份的做用基本有三个: 灾难恢复,审计,测试。
《高性能MySQL》是一本兼顾深度和广度的书,没有那么多的原理性细节,适合开发阅读。若是想更深刻学习,估计《数据库系统实现》是一本比较适合的书。