写在读完整本书之后。
总得来说,对于开发同学来说,特别是层级不高的开发同学。不值得推荐,也不值得花100大洋买实体书,我京东五折优惠买的都觉得不值,虽然知识是无价的。整本书章节划分不是很清晰,内容流于表面,重点的都没有深挖,比如索引,比如锁,比如引擎。而且书中大量都是运维同学使用的语句,对开发同学来说可能用处不大,闲来看看可能还可以。
最不能让我接受的一点就是,有2处以上错别字。不清楚责编和审校都是怎么工作的......
背景
想要扎实一下数据库相关的知识,又因为团队要求每个季度一本新书,所以就选择了这本。此篇记录下读书笔记。
目前读下来发现有点选错书了,不太适合我这种辣鸡开发,打算和《高性能MySQL》一起看,算扩充知识了吧【x
第1章 数据库介绍与分类
数据库的定义
对数据按照一定的数据结构(指数据的组织形式或数据之间的联系)进行组织个存储,并对数据进行管理。
数据库的分类
常用关系型数据库介绍
Oracle
主要应用于传统企业、政府、金融相关
MySQL
- 开源的中小型关系数据库
- 体积小、速度快、成本低、源码开放
- 拥有高并发的成熟解决方案
MariaDB
- Mysql的一个分支,避免MySQL闭源的备份
SQL Server
- 大型关系型数据库,只能在Windows下运行
Access
- 桌面关系型数据库,并不是数据库语言,只是数据库程序,集成在Office中。
postgreSQL
- 支持大部分SQL标准,是一个很有潜力的数据库
常用非关系型数据库介绍
Memcached
- 开源、支持高性能、高并发的分布式内存缓存系统。C语言编写,只有2000行代码。【真厉害啊.jpg】
- 纯内存的缓存系统,机器重启数据就会丢失
redis
- value类型支持string、list、set、zset
- 缓存在内存中,但是会周期性的写入磁盘或者追加到记录文件中
- 支持主从、分布式等集群模式
- 支持队列等特殊功能
MongoDB
- 数据结构非常松散,支持存储复杂的数据类型
- 面向集合存储:每个集合有一个唯一标识名,类似于表
- 支持动态查询
- 支持完全索引,包含内部对象
- 使用高效的二进制数据存储,包括大对象(如视频)
- 文件存储格式为BSON
Cassandra
- 由一堆数据库节点共同构成的一个分布式网络服务。
- 是一个混合型的非关系型数据库
第2章 MySQL数据库入门知识介绍
- 数据库版本更新后上线策略:从边缘业务慢慢过渡到核心业务
- 使用至少发布半年以上的稳定版本
- 选择向后较长时间没有更新发布的版本
- 据官方讲,MySQL 5.6是有史以来最好的版本【我不信,哈哈😂
第3章 MySQL数据库安装方法及安装实践
- 经常查看服务运行日志是个很好的习惯,也是高手的习惯【真假
第4章 MySQL多实例数据库企业级应用实践
- 多实例是指:在一台服务器上同时开启多个不同的服务端口,同时运行多个MySQL服务进程,这些服务进程通过不同的socket监听不同的服务端口来提供服务
- 多实例MySQL在逻辑上看是独立的,根据各自的配置来获取服务器的硬件资源。但是目前更广泛的是通过不同的虚拟机切割资源配置独立的服务
- 多实例的好处:节省服务器资源,充分利用剩余资源
- 多实例的缺点:一个实例占用系统资源过高,影响其他实例的正常运行
- 实际应用:从库使用多实例配置
- 工作开发和运维的统一原则:降低耦合度
第5章 MySQL常用管理基础知识实践
本章讲解了MySQL的启动与关闭、客户端连接、help命令。感觉和开发人员没太大关联性,就不记录了,都是一堆命令【x
第6章 MySQL常用管理SQL语句应用实践
SQL分类
1. SQL:结构化查询语言,对关系型数据库中的数据进行定义和操作的语言,是高级的非过程化编程语言。
2. 分类
- DQL:数据查询语言 SELECT
- DML:数据操作语言 INSERT、UPDATE、DELETE
- TPL:事务处理语言 BEGIN TRANSACTION、COMMIT、ROLLBACK
- DCL:数据控制语言 GRANT、REVOKE (授权相关)
- DDL:数据定义语言 CREATE、DROP、ALTER
- CCL:指针控制语言 DECLARE CURSOR、FETCH INTO、UPDATE WHERE CURRENT (用于对一个或多个表的单独行进行操作)
SQL解析原理流程
常用SQL语句
- 创建数据库
create database dbName
- 查看所有数据库
show databases
-- information_schema 为系统表,存储数据库内置对象信息,如用户、权限等
-- mysql 为系统表,存储用户授权和权限相关的信息
-- performance_schema 为系统表,存储与性能相关的表数据
- 切换数据库
use dbName
- 查看数据库的表信息
show tables from dbName like '%tableName%'
- 删除数据库
drop database dbName
- 创建表
create table userBaseInfo (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`isDeleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否删除0.正常 1.已删',
`nickName` varchar(500) NOT NULL DEFAULT '' COMMENT '昵称',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户基础信息表'
- 查看建表语句
show create table tableName\G
desc tableName
- 更改表名
rename table oldTableName to newTableName
alter table oldTableName rename to newTableName
- 增加表字段
-- 增加单个字段
alter table userBaseInfo add `mobileNum` varchar(100) DEFAULT '' COMMENT '手机号';
-- 同时增加多个字段
alter table userBaseInfo add
`mobileNum` varchar(100) DEFAULT '' COMMENT '手机号',
`weChatId` varchar(500) DEFAULT '' COMMENT '微信id';
-- 增加字段为第一个
alter table userBaseInfo add `mobileNum` varchar(100) DEFAULT '' COMMENT '手机号' first;
-- 增加字段到指定字段后
alter table userBaseInfo add `mobileNum` varchar(100) DEFAULT '' COMMENT '手机号' after id;
- 修改表字段
alter table UserBaseInfo change weChatId `weChatId` varchar(600) DEFAULT '' NOT NULL COMMENT '微信id';
alter table UserBaseInfo modify column weChatId varchar(600) DEFAULT '' NOT NULL COMMENT '微信id';
- 删除表字段
alter table userBaseInfo drop weChatId;
- 创建索引
alter table tableName add index indexName(fieldName);
create index indexName on tableName(fieldName);
- 删除索引
alter table tableName drop index indexName;
- 删除表
drop table tableName;
- 插入数据
insert into UserBaseInfo(nickName, mobileNum) values
('王富贵儿', 'XXXXXXXXX'),
('白月初', 'YYYYYYYYYYY');
- 查询数据
select * from UserBaseInfo where id = 1;
-- 查询前两条
select * from UserBaseInfo limit 2;
-- 从第0条开始,查询前10条
select * from UserBaseInfo limit 0, 3;
-- 查询交集
select * from UserBaseInfo where id > 3 and id < 10;
-- 查询并集
select * from UserBaseInfo where id < 3 or id > 10;
-- 排序
select * from UserBaseInfo order by id desc;
- 更新数据
update UserBaseInfo set nickName = '王权富贵', password = 'KKKKKKKK' where id = 2;
- 删除数据
delete from UserBaseInfo where id = 1;
- 清空表中数据 (速度大于delete全表删除)
truncate table tableName;
其他
字段类型
修改表注意事项
- 不要在流量高峰处理大表的更改
- 下班的时候不要独自修改生产环境
- 当数据量很大或访问量很大的时候,不适合临时建立索引。要在流量低谷时创建索引
- 慎用无条件的update、delete语句,慎重回车键
第7章 MySQL数据库备份与恢复基础实践
全是命令,过......
第8章 MySQL企业级备份应用知识与实践
全是命令,过......
第9章 MySQL物理备份工具Xtrabackup应用实践
全是命令,过......
第10章 MySQL数据库日志知识与企业应用实践
第11章 MySQL数据库字符集
字符编码的定义
将人类使用的字符(各种语言、符号等),通过预先设定的转换规则,转换为计算机可以识别的二进制数字的一种编码方式
常见的字符集
- ASCII:英文字母、英文标点符号、特殊字符
- GBK、BIG5、GB232:支持中文
- UTF:万国码
MySQL中的字符集
1. 包含两部分:字符集、校对规则。校对规则是定义比较字符串的方式。每个字符集至少有一个校对规则,也可能会有多个校对规则。
2. 字符集 utf8mb4 兼容 utf8,且可以表示更多的字符
3. 数据库字符集统一的7个级别
- 操作系统
- 操作系统客户端
- MySQL实例
- 库
- 表及字段
- MySQL客户端(连接及返回结果)
- 程序代码
第12章 MySQL数据库存储引擎知识
概念
同样一张表的数据,无论采用什么引擎来存储,用户看到的数据都是一样的。但是对于不同的引擎存取,引擎功能、占用空间大小、读取性能等都是有区别的。
存储引擎在MySQL里都是通过插件的方式使用的,可以轻易地从MySQL中进行加载和卸载,Mysql可以同时支持多种存储引擎。
结构图及说明
InnoDB简介
- MySQL 5.6及之后版本默认的存储引擎
- 支持事务,具有提交、回滚的功能
- 可以通过崩溃恢复能力来保护用户的数据,
- 读写数据使用行级锁,可以提升用户并发访问的能力
- 以集群的索引方式存储用户数据
- 基于主键方式查询可提高I/O性能
InnoDB引擎调优的基本方法
- 主键尽可能的小,以避免对Secondary index带来过大的空间负担
- 建立有效的索引,以避免全表扫描,因为会使用表锁
- 尽可能缓存所有的索引和数据,以提高响应速度,减少磁盘IO
- 在进行大批量小插入的时候,应自己控制事务而不使用autocommit
- 合理设置innodb_flush_log_at_trx_commit的值,不要过度追求安全性
- 避免主键更新,因为会带来大量的数据移动
InnoDB与MyISAM对比
NDB存储引擎
NDB是集群存储引擎,能够提供更高级别的高可用性和可扩展性,其特点是将数据全部放在内存中。
第13章 MySQL引擎之InnoDB
关键属性
- 完整支持事务ACID特性,包括commit、rollback、crash
- 支持数据行锁
- 支持多版本并发控制(MVCC)
- 支持外键功能,管理数据的完整性
- 支持一致性非锁定读
- 利用主键的聚簇索引在底层存储数据,提升对主键查询的IO性能
体系结构
【todo: 这本书写得太乱了,后面细了解下,每个单独再写文章记录下】
缓存池
- buffer pool
- change pool
- AHI(自适应哈希索引)
- double write
- redo log buffer
后台线程
- master线程
- IO线程
- purge线程
- 脏页刷新线程
底层数据文件
- undo log
- redo log
- 系统共享表空间
- file-per-table (独立表空间)
- 临时表空间
InnoDB表
自增主键
- 通过表在内存中保存一个自增长计数器实现
- 可以指定起始值及步长
主要限制
- 单表最多1017个列
- 单表最多64个二级索引
- 联合索引,最大支持16个列
- 如果表中不存在text或blob类型字段,行数据整体的最大长度是65535字节
第14章 MySQL主从复制知识与应用实践
原理
使用binlog日志,将Master(主库)的日志传输到从库,然后Slave(从库)执行SQL,来达到数据一致。
Master使用binlog dump线程记录binlog日志,Slave的IO线程去Master读取binlog到本地,记录在Relay Log中,然后SQL线程负责解析Relay Log为SQL语句进行执行,从而完成数据复制。
方式
- 单向:一主一从、一主多从
- 双向主主复制
- 线性级联单向双主复制:A -》 B -》 C
- 环状级联单向多主复制:A -》 B -》 C -》A
作用
- 支持大规模高并发读写
- 解决服务器宕机情况下的数据备份和快速业务切换
第15章 MySQL主从复制高级方案与应用实践
MySQL集群架构
- 读写分离
- 根据业务对从库做拆分
- 实现主库的高可用:mysql MHA + keepalived方案
主从复制常见延迟原因
- 一个主库配置的从库太多:建议3-5个
- 慢SQL过多
- 主库写压力过大
- 网络延迟
主从复制发生延迟的解决方案
- 采用半同步复制:即主库和从库都写完了,再返回结果给用户
- 延迟发生时改读主库
主从延迟复制方案
作用
避免语句级误操作(DDL语句),导致从库数据也是不正确的。通过延迟来修补数据
实现
和主从异步复制相同,只是从库SQL线程的语句执行被延迟。这样做的好处是,即使主库宕机了,但是binlog已经被读取到了从库的Relay Log中,依然能够保证数据一致。
第16章 MySQL复制高级方案应用实践
级联复制
A-》B -》C,减轻了主库的压力,B可以作为A的备用
主主复制
使用主主的初衷是为了能够高并发的写入,但是结果却是不尽如人意。因为一个库写入,另一个库也会写入。大量写操作的时候,压力并没有变小。主主复制的目的,应该是为了主库宕机后的快速切换。
提高写的效率:
-
分库:按业务分库
-
分表:横拆(常用字段一个表,不常用字段一个表);纵拆(把记录按一定量拆分到不同的表)
第17章 MySQL半同步复制与GTID复制实践
半同步复制
主库执行语句后,等待至少有一个从路接收到binlog并写入到Relay Log后,再返回给用户结果。这样相比于异步复制,增加了数据安全;也比全同步复制研制少一些。
也保证了在主库异常的情况下,至少又一台从库数据是完整的。如果主库等待超时的话,会自动转换为异步复制,所以用户体验也能接受。
建议半同步的从库不提供任何服务,只用来进行数据备份。
GTID复制
不太实用,不写了......
第18章 MySQL集群高可用方案MHA应用实践
MHA简介
MySQL高可用解决方案,保证主从复制中主库的高可用。当主库发生异常后,能够在1-30秒内实现故障自动检测和自动转移,选择一个最优的从库进行切换,变为主库,并保证其他从库和新的主库数据一致。
MHA 分为 Manager 和 Node 两种节点,Manager建议单独部署,用于管理主从复制集群,Node需要运行在每一个MySQL服务器上。
MHA优点
第19章 MySQL读写分离Atlas工具实践
书上就写了怎么安装,回头查查是个什么东东。
第20章 云关系型数据库
恕我直言,写了50页,完全就是 阿里云 RDS for MySQL 的软文......