《MySQL入门与提高实践》读书笔记【END】

写在读完整本书之后。

总得来说,对于开发同学来说,特别是层级不高的开发同学。不值得推荐,也不值得花100大洋买实体书,我京东五折优惠买的都觉得不值,虽然知识是无价的。整本书章节划分不是很清晰,内容流于表面,重点的都没有深挖,比如索引,比如锁,比如引擎。而且书中大量都是运维同学使用的语句,对开发同学来说可能用处不大,闲来看看可能还可以。

最不能让我接受的一点就是,有2处以上错别字。不清楚责编和审校都是怎么工作的......


背景

想要扎实一下数据库相关的知识,又因为团队要求每个季度一本新书,所以就选择了这本。此篇记录下读书笔记。

《跟老男孩学Linux运维:MySQL入门与提高实践》

目前读下来发现有点选错书了,不太适合我这种辣鸡开发,打算和《高性能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引擎调优的基本方法

  1. 主键尽可能的小,以避免对Secondary index带来过大的空间负担
  2. 建立有效的索引,以避免全表扫描,因为会使用表锁
  3. 尽可能缓存所有的索引和数据,以提高响应速度,减少磁盘IO
  4. 在进行大批量小插入的时候,应自己控制事务而不使用autocommit
  5. 合理设置innodb_flush_log_at_trx_commit的值,不要过度追求安全性
  6. 避免主键更新,因为会带来大量的数据移动

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 的软文......

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值