1. 1.MySQLhistorical

    1. MySQL安装 - MySQL安装配置.md 2. MySQL使用 - MySQL数据类型.md 3. MySQL架构 - MySQL架构.md 4. MySQL集群 - MySQL主从复制.md 5. MySQL线上问题排查 MySQL线上问题排查.md 6. MySQL压测 MySQL压测

  2. 1.1 MySQL explainhistorical

    1. 是什么 用来查看MYSQL是怎么执行sql语句的,以便优化sql 2. 作用 - 表的读取顺序 - 哪些索引可以使用 - 实际用到的索引 - 每张表读取了多少行 3. 字段说明 3.1. id - 一个select对应一个id - id相同的情况下由上往下执行 - 连接查询,一个select+

  3. 1.2 MySQL主从复制historical

    1. 主从复制是什么 - 将主库的数据同步到从库 2. 主从复制的作用 分布式系统复制.md 3. 主从复制的使用场景 - 读多写少且读的时候对数据时效性要求没那么高 4. 如何开启主从复制 - my.ini 5. 主从复制的原理 MySQL增删改数据的时候除了更新数据外,还会把增删改写入binlo

  4. 1.3 MySQL SQL调优historical

    1. 单机MySQL瓶颈 300万数据,2000并发 2. 整体思路 - 数据库优化.md 3. 步骤 3.1. 定位慢查询 - MySQL慢查询日志.md - MySQL索引.md 3.2. 分析SQL - MySQL explain.md - MySQL show profile.md 3.3.

  5. 1.4 MySQL安装配置historical

    1. 安装MySQL步骤 1.1. 安装 1.2. 启动 1.3. 设置root密码 1.4. 创建用户 1.5. 修改监听端口 2. 默认配置 2.1. 打印默认配置信息 2.2. 配置文件位置 2.3. 基础配置 2.3.1. log-bin 主要用于主从复制 2.3.2. log-error

  6. 1.5 MySQL查询优化器historical

    1. 查询优化器是什么 - 把语法分析树变为查询树,而查询树有很多种,每种查询树对应一种查询的执行方式 - 查询优化器的作用就是找到其中最好的执行方式 2. 查询优化器怎么优化SQL - 涉及两个优化:逻辑查询优化和物理查询优化 2.1. 逻辑查询优化 - 如何找出SQL语句等价的变换形式,使得SQ

  7. 1.6 MySQL存储引擎historical

    1. 存储引擎是什么 - MySQL中负责存储相关的组件 - 用于处理SQL操作,跟底层文件系统打交道 2. 存储引擎分类 - 查看所有的存储引擎 - 默认的存储引擎 2.1. InnoDB - MySQL InnoDB.md 2.2. MyISAM 2.3. Memory - 主键ID是Hash索

  8. 1.7 MySQL锁historical

    1. 锁是什么 - 数据库锁.md 2. 锁的实现 - trx信息 :代表这个锁结构是哪个事务生成的。 - is waiting :代表当前事务是否在等待 3. 锁的分类 - 根据加锁的范围,MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类 3.1. 全局锁 3.1.1. 是什么 - Flus

  9. 1.8 MySQL索引historical

    1. 索引是什么 - 索引是对数据库表中一或多个列的值进行排序的结构,是帮助MySQL高效获取数据的数据结构(B+Tree) 2. 索引分类 2.1. 根据是否主键分类 - 主键索引 - 数据列不允许重复,不允许为NULL,一个表只能有一个主键 - 二级索引 - 基本的索引类型,没有唯一性的限制,允

  10. 1.9 MySQL索引底层实现historical

    1. 索引底层实现 - 在InnoDB存储引擎中,每一个索引对应一棵B+树 2. 为什么选用B+树 首先我们先思考为什么选用树这种结构,而不是线性表或者链表 2.1. 为什么是树 - 线性表的特点是查找快O(1),但是插入删除效率低O(n) - 链表的特点是插入删除快O(1),查找慢O(n) - h

  11. 1.10 MySQL文件系统historical

    1. 数据库在文件系统中的表示 - 每个database都对应数据目录下的一个子目录,或者说对应一个文件夹 1. 在 数据目录 下创建一个和数据库名同名的子目录(或者说是文件夹)。 2. 在该与数据库名同名的子目录下创建一个名为 db.opt 的文件,这个文件中包含了该数据库的各种属性,比方说该数据

  12. 1.11 MySQL页historical

    1. 行格式 - Record(Row、记录)在磁盘上存放的格式 1.1. Compact 1.1.1. 记录的额外信息 1.1.1.1. 变长字段长度列表 - 比如varchar(100)、blob、text,会把长度记录在这里 1.1.1.2. NULL值列表 - 使用bit记录列是否为NULL

  13. 1.12 MySQL数据类型historical

    MySQL数据类型的历史学习笔记

  14. 1.13 MySQL bin-loghistorical

    1. bin-log是什么 - MySQL Server层的日志,用于日志归档 - 记录了对于数据库的变更操作,不包括查询操作。 2. 为什么有了redo-log还需要bin-log - redo-log是InnoDB存储引擎的,而bin-log是MySQL Server层面的 3. bin-log

  15. 1.14 MySQL架构historical

    1. MySQL逻辑架构图 - - 1. 客户端请求服务器 2. 服务器的连接管理器负责处理连接 3. 服务器的查询优化器负责处理SQL - 一条查询语句进行语法解析之后就会被交给查询优化器来进行优化,优化的结果就是生成一个所谓的 执行计划 - 这个执行计划表明了应该使用哪些索引进行查询,表之间的连

  16. 1.15 MySQL连接器historical

    1. 连接器是什么 - 负责处理客户端的连接 2. 连接器作用 2.1. 管理连接 - 如果客户端超过wait timeout没有请求,那么会自动断开 - 默认是长连接,即客户端建立连接后多次查询使用同一个连接 - 避免OOM,可以定期断开长连接 2.2. 权限验证 - 验证用户名密码 3. 连接协

  17. 1.16 MySQL统计数据historical

    1. MySQL统计数据是什么 MySQL查询成本基于统计数据计算的 2. 统计数据有哪些 2.1. 基于磁盘的永久性统计数据 - 这种统计数据存储在磁盘上,也就是服务器重启之后这些统计数据还在。 2.1.1. 存放位置 - 存放在两个表里 - innodb table stats 存储了关于 表

  18. 1.17 MySQL表访问方法historical

    1. 单表访问方法 - MySQL 执行查询语句的方式称之为 访问方法 或者 访问类型 1.1. const 1.1.1. 通过主键或者唯一二级索引与等值比较只匹配1条记录 1.1.1.1. 通过主键与常数的等值比较 - 1.1.1.2. 通过唯一二级索引列与常数的等值比较 - 1.2. ref 1

  19. 1.18 MySQL慢查询日志historical

    1. 是什么 将查询时间超过一定阙值的语句记录到日志中 2. 使用 2.1. 如何开启 需要重新连接数据库才能看出效果 2.2. 如何查看 - 直接查看日志 - 使用mysqldumpslow命令 3. 参考 <https://mariadb.com/kb/en/library/documentat

  20. 1.19 MySQL show profilehistorical

    1. 是什么 2. 使用 2.1. 开启 2.2. 查看结果 2.3. 分析

  21. 1.20 系统数据库historical

    - mysql: - 它存储了MySQL的用户账户和权限信息,一些存储过程、事件的定义信息,一些运行过程中产生的日志信息,一些帮助信息以及时区信息等。 - information schema: - 这个数据库保存着MySQL服务器维护的所有其他数据库的信息,比如有哪些表、哪些视图、哪些触发器、哪些

  22. 1.21 MySQL分析器historical

    1. 分析器是什么 - 对SQL语句解析 2. 分析器作用 2.1. 词法分析 - 语句- 字符串Token 2.2. 语法分析 - 字符串Token- 语法树

  23. 1.22 MySQL执行器historical

    1. 执行器是什么 - 执行SQL 2. 执行器作用 2.1. 权限校验 - 比如是否有Select权限 2.2. 拉取数据 - 调用存储引擎的接口获取数据,满足条件则放在结果集

  24. 1.23 MySQL线上问题排查historical

    CPU 100% 1. 使用 show processlist 列出所有进程,看看里面跑的 session 情况,是不是有消耗资源的 sql 在运行 2. 找出消耗高的 sql,然后 kill 掉这些线程;通过 explain 分析SQL

  25. 1.24 MySQL压测historical

    性能测评(1):MySQL云数据库vs自建数据库 \- 云\+社区 \- 腾讯云 Mysql专栏 \- 线上调优与压力测试 \- SegmentFault 思否

  26. 1.25 云MySQLhistorical

    1. 腾讯云MySQL - 示例环境使用的是腾讯云上的MySQL 1.1. 部署 - 节点拓扑:<已脱敏> - 节点配置:<已脱敏> - 版本5.7 1.2. 可用性 - 服务等级协议 1.3. 参数 - 云数据库 MySQL 设置实例参数-操作指南

  27. 1.26 MySQL InnoDB Buffer Poolhistorical

    1. Buffer Pool是什么 - MySQL启动时向操作系统申请的连续的内存空间 2. 为什么需要Buffer Pool - 磁盘和CPU的速度差异太大,因此需要内存作为缓存 3. Buffer Pool工作流程 - 读数据时向从Buffer Pool中读,有的话直接返回,没有再去磁盘读,然后

  28. 1.27 MySQL调优historical

    1. 整体思路 1. 通过慢查询日志/监控/Druid记录慢SQL - MySQL调优.md 2. 使用explain分析 - 索引失效 - join查询太多表 - 服务器参数配置低 3. 加索引 - MySQL索引.md - 注意索引失效的场景 4. 修改sql语句 - 视情况使用join或者ex

  29. 1.28 canalhistorical

    1. canal是什么 - 解析MySQL bin-log的组件 2. 为什么需要canal - 获取MySQL数据增量变化,同步到Elasticsearch、Redis等组件中 3. canal原理 - 本质上就是模拟主从复制的slave,所以跟MySQL主从复制.md一样 4. 如何使用cana

  30. 1.29 InnoDB Buffer Poolhistorical

    1. Buffer Pool是什么 - MySQL启动时向操作系统申请的连续的内存空间 2. 为什么需要Buffer Pool - 磁盘和CPU的速度差异太大,因此需要内存作为缓存 - 在InnoDB访问表和索引数据时会在其中进行高速缓存,大量减少磁盘IO操作,提升效率 3. Buffer Pool

  31. 1.30 InnoDB MVCChistorical

    1. MVCC是什么 - 多版本并发控制 - 为了使不同事务的 读-写操作可以并发执行 ,对数据进行多版本处理,并通过事务的可见性来确定自己应该看到的数据版本 2. MVCC原理 - 从哪里取数据:版本链 - 取哪个版本的数据:ReadView 2.1. 版本链 - InnoDB undo log.

  32. 1.31 InnoDB redo loghistorical

    1. redo log是什么 - MySQL InnoDB存储引擎的日志,用于崩溃恢复 - redo log是一种基于磁盘的数据结构,在崩溃恢复期间用于纠正不完整事务写入的数据 2. 为什么需要redo log - 根据持久性的要求,事务一旦commit完成那么就必须落盘保存。有两种方案 - 一种是

  33. 1.32 InnoDB undo loghistorical

    1. undo log是什么 - MySQL InnoDB存储引擎的日志 - 主要记录了数据的逻辑变化 - 一条 INSERT 语句,对应一条 DELETE 的 undo log - 一条 UPDATE 语句,对应一条相反的 UPDATE 的undo log - 一条 DELETE 语句,对应一条

  34. 1.33 InnoDB事务historical

    1. 什么是事务 数据库事务.md 2. 事务的使用 - 开启事务: begin 或者 start transaction - 提交事务: commit - 自动提交事务: - SHOW VARIABLES LIKE 'autocommit' - 默认情况下,每一条语句都算是一个独立的事务 - 回滚

  35. 1.34 InnoDB表空间historical

    1. 表空间是什么 - 表空间是个抽象的概念 - 逻辑上 - 可以想象成页的池子 - 物理上 - 对于系统表空间来说,对应着文件系统中一个或多个实际文件 - 默认情况下, InnoDB 会在 数据目录 下创建一个名为 ibdata1 、大小为 12M 的文件,并且大小自扩展 - 对于每个独立表空间来

  36. 1.35 InnoDB和MyISAM索引对比historical

    1. InnoDB - MySQL默认的存储引擎 - InnoDB把数据分成若干页,每个页大小16KB,以页作为磁盘和内存交互的基本单位 - 即读最少读一页,写最少写一页 1.1. 索引实现 1.1.1. 主键索引 - 叶子节点的data存放的就是实际的数据 - - 由于索引上面存放的是实际的数据,

  37. 1.36 MySQL InnoDBhistorical

    1. InnoDB特点 1.1. 支持事务 - InnoDB事务.md 1.2. 支持行级锁 - MySQL锁.md 1.3. 支持MVCC - InnoDB MVCC.md 2. InnoDB架构 2.1. 内存层 2.1.1. Buffer Pool - 读缓冲区,目的是提升InnoDB性能,加

  38. 1.37 MySQL Flushhistorical

    1. 什么是Flush - 当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页” - Flush就是把脏页刷入磁盘 2. Flush触发时机 - 当出现几种情况的时候会把 - redo-log写满了(尽量避免,

  39. 2.PostgreSQLhistorical

    1. SQL优化 - PostgreSQL explain.md 2. 事务 - PostgreSQL隔离级别.md - PostgreSQL MVCC.md

  40. 2.1 PostgreSQL隔离级别historical

    1. 实现 PostgreSQL中根据获取快照时机的不同实现了不同的数据库隔离级别(对应代码中函数GetTransactionSnapshot): - Read UnCommited/Read Commited:每个query都会获取最新的快照CurrentSnapshotData - Repeta

  41. 2.2 PostgreSQL MVCChistorical

    1. 总体规则 - 在PostgreSQL中,每一个事务都会得到一个被称作为 XID 的事务ID - 可以通过 select cast(txid current() as text) 查询 - 这里说的事务不仅仅是被 BEGIN - COMMIT 包裹的一组语句,还包括单条的 insert 、 up

  42. 2.3 PostgreSQL explainhistorical

    1. 不加where 1.1. 普通的explain - 结果 1.1.1. 解析 - 读取的方式 - 顺序扫描,一块块读取 - 统计信息 - cost - 获取第一行的时间 - 获取所有行的时间 - 单位是规划器cost unit,不是毫秒 - rows - 扫描的行数 - width - 所有行的平均

  43. SQL Join查询historical

    1. 连接查询是什么 把各个连接表中的记录都取出来依次匹配的组合加入结果集并返回给用户 2. Join种类有哪些 2.1. 内连接 驱动表中的记录在被驱动表中找不到匹配的记录, 不会 加入到最后的结果集 on和where后的条件等价 驱动表和被驱动表是可以互换的,不加条件等价于笛卡尔积 举例 2.2. 外连接 驱动表中的记录即使在被驱动表中没有匹配的记录, 会 加入到结果集 必须使用 ON 子句来指出连接条件 on和where不等价 左外连接:选取左侧的表为驱动表;右外连接:选取右侧的表为驱动表 举例 2.3. 例子 tb item:3096 tb item cat:1182 No1 A表的所

  44. SQL执行顺序historical

    1. 是什么 1. 执行from join on,创建临时表 2. 执行where,过滤掉数据。这里不能使用select中的别名,只能使用from和join表中的字段,因为select还没有执行 3. 执行group by,执行后这个值唯一的分成一组,并且select后面可以使用聚合函数 4. 执行having,分组之后每个组内的值进行过滤。同where不能使用select中的别名 5. 执行select,选择显示的字段 6. 执行distinct,行去重 7. 执行order by,排序,这里可以使用select中的别名 8. 执行limit,offset,限制条数 2. 参考 SQL查询之

  45. 关系型数据库historical

    1. 什么是关系型数据库 采用了关系模型来组织数据的数据库 关系 一对一 一对多 多对多:可以通过中间表拆解成两个一对多 2. 为什么需要关系型数据库 3. 关系型数据库特点 3.1. 表结构存储 数据的存储采用二维表格模型,即行和列的形式 3.2. 规范化设计 数据库范式.md 3.3. 使用SQL查询数据 SQL Join查询.md 3.4. 支持事务 数据库事务.md 4. 数据库优化 数据库优化.md 5. 数据库原理 5.1. SQL执行顺序 SQL执行顺序.md 5.2. 锁 数据库锁.md 5.3. B+Tree B Tree.md 6. 常用关系型数据库 6.1. MySQL

  46. 数据库乐观锁与悲观锁historical

    1. 悲观锁 2. 乐观锁 乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测 版本号 增加一个version字段。先查一次,更新时原来的语句基础上 update xxx set version=version+1 where version=version ,失败则循环 3. 参考 数据库第一类第二类丢失更新 云+社区 腾讯云

  47. 数据库事务historical

    1. 什么是事务 将多个读写操作合并成一个逻辑单元,视作一个操作执行 这个操作满足ACID特性 2. 为什么需要事务 主要是为了让应用层简化对一系列问题的处理 事务是一个抽象层,应用程序 事务 数据库。 通过事务的抽象应用程序可以假装数据库不会崩溃(原子性),没有其他人同时访问数据库(隔离),存储设备是完全可靠的(持久性) 所有这些错误都被简化为 事务中止 ,而应用需要的仅仅是重试 3. 事务的特性 3.1. A (原子性) 3.1.1. 原子性是什么 无论有多少条sql语句,要么整体执行失败,要么整体执行成功。 原子性 这个的原子性不是指并发的,即不是描述多个线程同时访问相同的数据会发生什么

  48. 数据库优化historical

    1. 什么是数据库优化 2. 数据库优化思路 2.1. 应用层 2.1.1. 缓存 如何设计缓存系统.md 2.2. 数据库层 2.2.1. SQL语句 MySQL SQL调优.md 2.2.2. 表结构 冗余字段到主表中 2.2.3. 复制 MySQL主从复制.md 2.2.4. 分区分库分表 数据库分库分表.md 2.3. 系统层 2.3.1. 调优服务器参数 MySQL配置 Linux配置 2.4. 硬件层 更强劲的机器 3. 参考 阿里P8架构师谈:MySQL慢查询优化、索引优化、以及表等优化总结 优知学院 MySQL 对于千万级的大表要怎么优化? 知乎

  49. 数据库分库分表historical

    1. 为什么需要分库分表 分布式系统分区.md 2. 分库分表是什么 分库是把原来的一个库分成多个库,分表是把原来的一张表分成多张表 分库和分表都有水平拆分和垂直拆分的方式 2.1. 垂直拆分 2.1.1. 垂直分表 每个表的结构都不一样,每个表的数据也不一样 把一张表的字段按照使用频率、是否大字段分成多张表(一对一关系)。比如把商品信息表分成商品基本信息表和商品描述表 这个操作一般在设计之初完成 2.1.2. 垂直分库 每个库的结构都不一样,每个库的数据也不一样 按照业务逻辑耦合程度把一个库分成多个库,部署在不同机器上。本质上和微服务按照业务拆分一个逻辑,每个服务对应一个数据库,比如商品信息

  50. 数据库死锁historical

    1. 什么是死锁 死锁是指两个(或多个)事务相互持有对方想要的锁 如果事务 1 在表 A 上获得一个排他锁,同时试图获取一个在表 B 上的排他锁, 而事务 2 已经持有表 B 的排他锁,同时却正在请求表 A 上的一个排他锁,那么两个事务就都不能进行下去。 1.1. 例子 两个并发事务在修改一个表。 第一个事务执行: 这样就在acctnum = 11111的行上获得了一个行级锁 然后,第二个事务执行: 第一个UPDATE语句成功地在指定行上获得了一个行级锁acctnum = 22222,因此它成功更新了该行 但是第二个UPDATE语句发现它试图更新的行已经被锁住了,因此它等待持有该锁的事务结束

  51. 数据库粒度锁historical

    1. 什么是粒度锁 数据库的锁按照粒度划分,可以分成行锁、页锁、表锁 2. 行锁 2.1. 是什么 行锁就是按照行的粒度对数据进行锁定 2.2. 分类 再按读写划分 共享锁:读锁,S(Share)锁。读取一条记录时,先获取该锁。多个读操作可以同时进行,但会阻塞写 独占锁:写锁,X(Exclusive)锁。修改一条记录时,先获取该锁。当前写操作没有完成前,会阻塞其他写和读操作 兼容性 使用 共享锁: SELECT ... LOCK IN SHARE MODE 独占锁: SELECT ... FOR UPDATE 3. 页锁 3.1. 是什么 页锁就是在页的粒度上进行锁定

  52. 数据库范式historical

    1. 定义 1NF:符合1NF的关系中的每个属性都不可再分 2NF:2NF在1NF的基础之上,消除了非主属性对于码的 部分 函数依赖 3NF:3NF在2NF的基础之上,消除了非主属性对于码的 传递 函数依赖 2. 参考 数据库第一二三范式到底在说什么? 知乎

  53. 数据库锁historical

    1. 是什么 多个事务并发访问同一份数据的时候,肯定会有冲突发生,那么怎么处理这种冲突呢? 主要有两种思想: 1. 悲观锁机制:避免冲突发生,如Read/Write Locks,Two Phase Locking 2. 乐观锁机制:允许冲突发生,后续需要检测出冲突,如MVCC 用Java语言描述 使用Java进行多线程编程的时候,需要加锁。 最简单的就是ReentranLock,这玩意读写互斥,读读互斥; 换成ReentrantReadWriteLock,这玩意读读不互斥,但是读写互斥; 最后换成CopyOnWriteList,这玩意读读不会互斥,读写也不会互斥; MVCC差不多类似于Copy