据说每个学 Python 的都有必要掌握至少一门数据库,不管是做数据分析、网络爬虫、Web 开发、抑或是机器学习,都离不开数据库打交道,开发小哥和小姐姐对数据库的要求也需要一路打怪升级,一般可归纳为三个阶段。

阶段一:懂 SQL 语句,能够根据业务需求实现 CRUD 功能

阶段二:懂数据库的基本原理、索引原理,能够定位分析数据库性能瓶颈,知道如何优化数据库,如何合理创建高效索引,如何防范SQL注入等。

阶段三:趋向于架构、数据安全,能够合理设计数据库表结构,能够实现分布式数据库、分表分库、主从、读写分离、数据安全备份等工作

想要达到这几个层级,还真有一本值得推荐的好书可以帮助大家不断进阶:

袋长老,来推荐

俊达——袋鼠云高级数据库专家

江湖人尊称一声“达叔”,袋鼠云的“扫地僧”,学霸奖获得者。曾任淘宝、支付宝DBA,全程参与淘宝核心业务系统底层存储系统改造,参与建设支付宝Mysql标准化运维体系。对于数据库体系结构和运作原理有深入的理解,擅长大数据量和高访问量OLTP数据库的设计和优化。

推荐书籍

《高性能MySQL》

豆瓣评分:9.4  推荐指数:✩✩✩✩✩

《高性能mysql(第3版)》是最具代表性的进阶书籍,它是 MySQL 领域的经典之作,内容涵盖 MySQL 架构和历史,性能分析,优化,复制、备份和恢复,高可用与高可扩展性。值得每一个后端工程师多次阅读,无论是工作中实战还是应付面试,都具有很大的指导意义。英语水平好的直接推荐看原版,相比第二版,第三版的翻译都是来自阿里的数据库团队,翻译水准很高,并且袋萌萌发现,袋鼠云的CTO宁海元(花名:江枫)赫然在列!

在互联网行业,MySQL数据库毫无疑问已经是最常用的数据库。和其他数据库系统相比,MySQL有点与众不同,它的架构可以在多种不同场景中应用并发挥好的作用,足够灵活,能够有适应高要求的环境。

第3版更新了大量的内容,不但涵盖了MySQL5.5版本的新特性,也讲述了关于固态盘、高可扩展性设计和云计算环境下的数据库相关的新内容,原有的基准测试和性能优化部分也做了大量的扩展和补充。内容涵盖MySQL架构和历史,基准测试和性能剖析,数据库软硬件性能优化,复制、备份和恢复,高可用与高可扩展性,以及云端的MySQL和MySQL相关工具等方面的内容。每一章都是相对独立的主题,读者可以有选择性地单独阅读。高性能MySQL第3版不但适合数据库管理员(DBA)阅读,也适合开发人员参考学习。不管是数据库新手还是专家,相信都能从本书有所收获。

读书笔记

一、MySQL架构与历史A.并发控制1.共享锁(shared lock,读锁):共享的,相互不阻塞的2.排他锁(exclusive lock,写锁):排他的,一个写锁会阻塞其他的写锁和读锁B.事务

1.事务ACID

* 原子性(atomicity)一个事务必须被视为一个不可分割的最小工作单元,整个事务中所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作    * 一致性(consistency)数据库总是从一个一致性的状态转换到另外一个一致性的状态    * 隔离性(isolation)一个事务所做的修改在最终提交以前,对其他事务是不可见的    * 持久性(durability)一旦事务提交,则其所做的修改就会永久保存到数据库中

2.四种隔离级别

* READ UNCOMMITTED(未提交读),事务中的修改,即使没有提交,对其他事务也都是可见的,事务可以读取未提交的数据,也被称为脏读(Dirty Read),这个级别会导致很多问题    * READ COMMITTED(提交读),大多数数据库系统的默认隔离级别,一个事务开始时,只能“看见”已经提交的事务所做的修改,一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的,也叫不可重复读(nonrepeatable read),有可能出现幻读(Phantom Read),指的是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行(Phantom Row)    * REPEATABLE READ(可重复读),通过InnoDB和XtraDB存储引擎,是MySQL的默认事务隔离级别    * SERIALIZABLE(可串行化)最高级别,通过强制事务串行执行,避免了幻读问题,会在读取的每一行数据上都加锁,可能导致大量的超时和锁争用的问题

3.死锁:指两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象4.事务日志:存储引擎在修改表的数据时只需要修改其内存拷贝,再把该修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘。事务日志持久以后,内存中被修改的数据在后台可以慢慢地刷回到磁盘,称为预写式日志(Write-Ahead Logging)C.多版本并发控制1.多版本并发控制(MVCC)是行级锁的一个变种,但是它在很多情况下避免了加锁操作,因此开销更低。虽然实现机制有所不同,但大都实现了非阻塞的读操作,写操作也只锁定必要的行2.MVCC的实现,是通过保存数据在某个时间点的快照来实现的,有乐观和悲观两种,只在REPEATABLE READ和READ COMMITTED两个隔离级别下工作D.MySQL的存储引擎1.MySQL的.frm文件保存表的定义,SHOW TABLE STATUS显示表的相关信息2.除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB引擎3.不要轻易相信MyISAM比InnoDB快之类的经验之谈,这个结论并不是绝对的二、MySQL基准测试A.为什么需要基准测试1.基准测试可以观察系统在不同压力下的行为,评估系统的容量,掌握哪些是重要的变化,或者观察系统如何处理不同的数据B.基准测试的策略1.两种主要的策略:

* 针对整个系统的整体测试(集成式full-stack)    * 单独测试MySQL(单组件式single-component)

2.测试何种指标:

* 吞吐量,指单位时间内的事务处理数,常用的测试单位是每秒事务数(TPS),或每分钟事务数(TPM)    * 响应时间或者延迟,用于测试任务所需的整体时间,根据具体的应用,测试的时间单位可能是微秒、毫秒、秒或者分钟。通常使用百分比响应时间(percentile response time)来替代最大响应时间    * 并发性,需要关注的是正在工作中的并发操作,或者是同时工作中的线程数或者连接数,在测试期间记录MySQL数据库的Threads_running状态值    * 可扩展性,给系统增加一倍的工作,在理想情况下就能获得两倍的效果(即吞吐量增加一倍),对于容量规范非常有用,可以提供其他测试无法提供的信息,来帮助发现应用的瓶颈

C.基准测试方法1.需要避免的一些常见错误:

* 使用真实数据的子集而不是全集    * 使用错误的数据分布    * 使用不真实的分布参数    * 在多用户场景中,只做单用户测试    * 在单服务器上测试分布式应用    * 与真实用户行为不匹配    * 反复执行同一个查询    * 没有检查错误    * 忽略了系统预热(warm up)的过程    * 使用默认的服务器配置    * 测试时间太短

2.应该建立将参数和结果文档化的规范,每一轮测试都必须进行详细记录3.基准测试应该运行足够长的时间,需要在稳定状态下测试并观察4.在执行基准测试时,需要尽可能多地收集被测试系统的信息5.自动化基准测试可以防止测试人员偶尔遗漏某些步骤,或者误操作,另外也有助于归档整个测试过程,可以选择shell、php、perl等,要尽可能使所有测试过程都自动化,包括装载数据、系统预热、执行测试、记录结果等D.基准测试工具1.集成式测试工具:

* ab,测试HTTP服务器每秒最多可以处理多少请求    * http_load,和ab类似,但更加灵活    * jMeter,可以加载其他应用并测试其性能

2.单组件式测试工具

* mysqlslap,可以模拟服务器的负载,并输出计时信息    * MySQL Benchmark Suite(sql-bench),单线程的,主要用于测试服务器执行查询的速度    * Super Smack,提供压力测试和负载生成,是一个复杂而强大的工具,可以模拟多用户访问,可以加载测试数据到数据库,并支持使用随机数据填充测试表    * Database Test Suite,类似某些工业标准测试的测试工具集    * Percona's TPCC-MySQWL Tool    * sysbench,多线程系统压测工具,可以根据影响数据库服务器性能的各种因素来评估系统的性能

看到此处,是不是意犹未尽?!

读书笔记厚厚一沓,奈何篇幅有限,本萌只能选取书中的前两个小节给大家做一个分享……

but,你还有一个更快领略书中精髓的办法!

“程序员的7日书单”只是一个序曲,

毕竟我们是一个有追求,爱分享,

关注程序员群体持续成长的技术团队,

所以,我们在第7日书单活动之后(7月6日)

决定和小伙伴们一起玩一个“彩蛋活动”!

来看看我们的奖品有:

三等奖:思考送什么礼物,思考到忧伤……

活动玩法和奖品规则——至今还是个谜!

敬请期待7月6日,谜底揭晓……

赶紧分享给身边的小伙伴吧!

往期回顾