• MySQL

    • 索引

      • B+树

      • B+树索引

        • 聚簇索引(主键索引)

          • 数据行本身就存储在索引的叶子节点里,索引和数据是同一个东西,不分离。
        • 辅助索引(二级索引)

          • 叶子节点不存完整数据,只存索引列的值 + 对应的主键值。

          • 什么是回表?

        • 联合索引

          • 联合索引就是把多个列组合在一起,建成一个索引。

          • 什么是最左前缀原则

        • 覆盖索引

        • B+树索引的分裂

        • B+树索引的管理

        • 索引下推

      • 全文索引

      • 哈希索引

      • 空间索引

      • 索引优化

      • 索引失效的原则

      • 一、锁的类型

        • 行级锁

          • 共享锁 S锁

          • 排他锁 X锁

        • 表级锁

          • 意向共享锁 IS

          • 意向排他锁 IX

        • 锁兼容矩阵

      • 二、InnoDB 三种锁算法

        • Record Lock 记录锁

        • Gap Lock 间隙锁

        • Next-Key Lock 临键锁

      • 三、一致性非锁定读

        • 读提交 RC

        • 可重复读 RR

      • 四、一致性锁定读(当前读)

        • SELECT … FOR UPDATE

        • SELECT … LOCK IN SHARE MODE

        • INSERT / UPDATE / DELETE

      • 五、自增锁 AUTO-INC Lock

        • innodb_autoinc_lock_mode

          • 0 传统模式

          • 1 连续模式

          • 2 交错模式

      • 六、外键与锁

      • 七、锁的问题

        • 脏读

        • 不可重复读

        • 幻读

        • 丢失更新

      • 八、死锁

        • 检测机制

        • 处理策略

        • 预防策略

      • 一、索引组织表

        • 主键的选择规则

        • _rowid 查看主键

      • 二、InnoDB 逻辑存储结构

        • 表空间 Tablespace

          • 系统表空间

          • 独立表空间 innodb_file_per_table

        • 段 Segment

          • 数据段

          • 索引段

          • 回滚段

        • 区 Extent

          • 大小固定 1MB

          • 由 64 个页组成

        • 页 Page

          • 默认 16KB

          • 页的类型

            • 数据页

            • Undo 页

            • 系统页

            • 事务数据页

            • 插入缓冲位图页

            • 插入缓冲空闲列表页

            • 未压缩二进制大对象页

            • 压缩二进制大对象页

        • 行 Row

      • 三、InnoDB 行记录格式

        • Compact 格式

          • 变长字段长度列表

          • NULL 标志位

          • 记录头信息

          • 列数据

        • Redundant 格式(旧格式)

        • 行溢出数据

          • VARCHAR 溢出

          • BLOB 溢出

        • Compressed / Dynamic 格式

      • 四、InnoDB 数据页结构

        • File Header 文件头

        • Page Header 页头

        • Infimum + Supremum

        • User Records 用户记录

        • Free Space 空闲空间

        • Page Directory 页目录

        • File Trailer 文件尾

      • 五、约束

        • 数据完整性

          • 实体完整性

            • 主键约束

            • 唯一键约束

          • 域完整性

            • 数据类型约束

            • DEFAULT 约束

            • NOT NULL 约束

          • 参照完整性

            • 外键约束 FOREIGN KEY
        • 约束的创建方式

          • 建表时定义

          • ALTER TABLE 添加

        • 约束与索引的区别

        • ENUM 和 SET 约束

        • 触发器与约束

        • 外键约束

          • CASCADE

          • SET NULL

          • NO ACTION / RESTRICT

      • 六、视图

        • 虚表,不存储数据

        • 用途

          • 简化查询

          • 权限控制

          • 数据抽象

        • 物化视图(MySQL 不原生支持)

      • 七、分区表

        • 分区类型

          • RANGE 分区

          • LIST 分区

          • HASH 分区

          • KEY 分区

          • COLUMNS 分区

        • 子分区

        • 分区与 NULL 值处理

        • 分区的性能优化

          • 分区裁剪 Partition Pruning
        • 分区的限制

    • 文件

      • 一、参数文件

        • 参数类型

          • 动态参数

          • 静态参数

      • 二、日志文件

        • 错误日志 Error Log

        • 慢查询日志 Slow Query Log

        • 查询日志 General Log

        • 二进制日志 Binlog

      • 三、Socket 文件

      • 四、PID 文件

      • 五、表结构文件

        • .frm 文件
      • 六、InnoDB 存储引擎文件

        • 表空间文件

          • 系统表空间

          • 独立表空间

          • 通用表空间

          • 临时表空间

        • 重做日志文件 Redo Log

    • 备份与恢复

      • 一、备份类型

        • 按备份方式

          • 热备 Hot Backup

          • 温备 Warm Backup

          • 冷备 Cold Backup

        • 按备份内容

          • 完全备份 Full Backup

          • 增量备份 Incremental Backup

          • 差异备份 Differential Backup

        • 按备份文件格式

          • 逻辑备份

          • 裸文件备份

      • 二、逻辑备份

        • mysqldump

        • SELECT INTO OUTFILE

        • mydumper

      • 三、裸文件备份

        • ibbackup

        • XtraBackup

      • 四、二进制日志备份

        • Binlog 备份

        • 配合全量备份做增量恢复

      • 五、复制备份

        • 主从复制

        • 在从库上做备份

      • 六、快照备份

        • LVM 快照

        • 存储层快照

      • 七、恢复

        • 完全恢复

        • 基于时间点恢复 Point-in-Time

        • 基于位置恢复

      • 八、备份策略

        • RTO 恢复时间目标

        • RPO 恢复点目标

        • 全量 + 增量组合策略

    • 复制

      • 一、复制原理

        • Binlog 主从同步流程

        • 三个线程

          • 主库 Binlog dump 线程

          • 从库 IO 线程

          • 从库 SQL 线程

      • 二、复制模式

        • 异步复制

        • 半同步复制

        • 全同步复制

      • 三、复制格式

        • STATEMENT

        • ROW

        • MIXED

      • 四、复制拓扑

        • 一主一从

        • 一主多从

        • 级联复制

        • 双主复制

      • 五、GTID 复制

        • 全局事务标识符

        • 优点

        • 配置方式

      • 六、并行复制

        • 库级别并行

        • 组提交并行

      • 七、复制延迟

        • 产生原因

        • 监控方式

        • 解决方案

      • 八、复制常见问题

        • 主从数据不一致

        • 复制中断处理

        • 跳过错误

    • InnoDB 存储引擎

      • 一、InnoDB 体系架构

        • 内存池

          • 缓冲池 Buffer Pool

          • 重做日志缓冲 Redo Log Buffer

          • 额外内存池

        • 后台线程

          • Master Thread

            • undo页回收

            • 脏页刷新

            • 合并插入缓冲

          • IO Thread

            • 使用AIO进行处理IO请求

            • 什么是AIO,他和NIO,BIO的区别是什么?

              • AIO

                • 异步非阻塞IO
              • NIO

                • 异步阻塞IO
              • BIO

                • 同步阻塞IO
            • 为什么在Java开发中使用NIO较多,而不是AIO

              • web开发网络IO为主,NIO已经能满足高并发场景

              • Java的AIO实现不是真正的异步非阻塞IO,使用线程池模拟这个过程 实际上底层还是同步阻塞IO (worker线程),线程数量和IO数量授权线程池大小限制

              • 主流生态上NIO为主

          • Purge Thread

            • 回收undolog ,在innodb1.1之前是在master Thread上进行的
          • Page Cleaner Thread

            • 1.2版本引入,回刷脏页数据到磁盘
      • 二、内存

        • 缓冲池 Buffer Pool

          • 数据页

          • 索引页

          • 插入缓冲

          • 自适应哈希索引

          • 锁信息

          • 数据字典

          • 主要用与填补cpu速度和磁盘速度的鸿沟,读取和操作时候优先通过缓冲池中的数据页数据操作,通过checkpoint机制回刷磁盘

            • 什么是checkpoint?

              • Sharp CheckPoint

                • 一次性回刷所有脏页数据到磁盘

                • 已不在使用,容易阻塞

              • Fuzzy CheckPoint

                • 每次回刷只刷部分,不是全部

                • 触发方式

                  • Master Thread CheckPoint 定期回刷

                  • FLUSH_LRU_LIST CheckPoint LRU空闲页不够时候会淘汰一些页,如果是脏页会先刷盘再淘汰

                  • Async/Sync Flush Checkpoint

                    • 当redo log 快被写满时候的保护机制

                      • Async Flush

                      • 细分主题 2

        • LRU 算法

          • 传统 LRU

          • InnoDB 改进 LRU(midpoint)

        • Flush 链表

        • Free 链表

        • 重做日志缓冲

        • 额外内存池

      • 三、Checkpoint 技术

        • 作用

        • Sharp Checkpoint

        • Fuzzy Checkpoint

          • Master Thread Checkpoint

          • FLUSH_LRU_LIST Checkpoint

          • Async/Sync Flush Checkpoint

          • Dirty Page too much Checkpoint

      • 四、Master Thread 工作方式

        • 每秒操作

        • 每十秒操作

        • InnoDB 1.2.x 版本优化

      • 五、InnoDB 关键特性

        • 插入缓冲 Insert Buffer

          • 条件

          • Change Buffer

          • 内部实现

          • 合并时机

        • 两次写 Double Write

          • 作用

          • 实现原理

        • 自适应哈希索引 AHI

        • 异步 IO

        • 刷新邻接页

      • 六、启动、关闭与恢复

        • innodb_fast_shutdown

        • innodb_force_recovery

    • 查询

      • 为什么查询速度会慢

      • 慢查询基础:优化数据访问

        • 是否请求了不需要的数据

        • 是否扫描了额外的记录

      • 重构查询的方式

        • 一个复杂查询 vs 多个简单查询

        • 切分查询

        • 分解联接查询

      • 查询执行的基础

        • 客户端/服务器通信协议

        • 查询状态

        • 查询优化处理

        • 查询执行引擎

        • 将结果返回给客户端

      • 查询优化器的局限性

        • UNION 的限制

        • 等值传递

        • 并行执行

        • 在同一个表中查询和更新

      • 优化特定类型的查询

        • 优化 COUNT()

        • 优化联接查询

        • 优化 GROUP BY

        • 优化 LIMIT 和 OFFSET

        • 优化 UNION

      • 一条sql查询语句是如何执行的?

        • 连接器

          • 负责服务端与客户端建立连接,验证密码是否正确,是否有权限
        • 分析器

          • 对要进行执行的SQL语句进行词法分析和语法解析
        • 优化器

          • 决定使用哪个索引,还有类似join时刻表的连接顺序等
        • 执行器

          • 真正执行这个sql语句,如果没有权限会拦截掉
      • 一条Update语句是怎么执行的?

        • 执行顺序

          • 执行器先去引擎中找到对应的行

          • 找到对应的行之后进行计算处理

          • 引擎将这部分数据记录到内存中,同时记录redo log 状态为prepare,告知执行器执行结束

          • 执行器生成binlog写入磁盘

          • 执行器调用引擎提交事务的接口,修改redo log的状态为commit

        • 什么是redo log

          • 这是物理日志.InnoDB特有,redo log记录了对于哪个数据页进行修改,同时保证脏页能够及时回刷到磁盘中(两阶段提交) 有大小限制,写策略是循环写

          • 什么是脏页?

            • 内存中与磁盘数据不一致的部分

            • 在InnoDB中,数据的读取是按照页(page)进行,读取一行数据时候会将这行数据整页的方式进行读入

        • 什么是bin log

          • 这是逻辑日志,MySQL的server实现的,记录了每一行数据的执行逻辑,默认无大小限制,写策略是追加写
        • 什么是两阶段提交

          • redo log 的两种状态,prepare和commit 保证宕机后数据可以正确恢复

          • 为什么两阶段提交可以保证数据可以被正确恢复?

            • 两阶段提交吧是否提交成功变成了 可重放,可判定的状态机,不依赖内存状态 我理解的正确恢复主要有三件事 1:已提交事务不丢失 2:未提交事务不生效 3:引擎存储数据和binlog一致(保证主从同步的数据一致性) 两阶段提交的原理为 1 写redo log prepare (落盘) 2 写 binlog 落盘 3 写 redo log commit 落盘 如果崩溃发生在3阶段: 事务已经提交 如果崩溃发生在2阶段:事务可以提交 如果崩溃发生在1阶段:事务回滚 binlog如果写入磁盘即可保证主从一致性 两阶段提交主要解决 redolog 以及 binlog的一致性
        • 为什么要有两份日志

          • redo log 和 binlog 的职能不同 redo log:给 InnoDB 自己用(本地崩溃恢复)主要解决的问题是内存数据没有回刷到磁盘的问题 binlog:给MySQL的server层使用,逻辑变更日志可以回放当时业务操作,由于是追加写入可长期保存归档 redo log 设计太底层,并且由于覆写限制无法实现归档/复制 binlog 是逻辑日志,无法处理引擎页级崩溃恢复设计,不能替代redo的快速本地恢复能力
    • I事务

      • 一、认识事务

        • 事务的分类

          • 扁平事务

          • 带有保存点的扁平事务

          • 链事务

          • 嵌套事务

          • 分布式事务

      • 二、事务的实现

        • 原子性 A

        • 持久性 D

        • 隔离性

          • 事务的四种隔离级别是什么

            • 读未提交

              • 一个事务还没提交时,它做的变更就能被别的事务看到
            • 读已提交

              • 一个事务提交之后,它做的变更才会被其他事务看到。
            • 可重复读

              • 一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的
            • 串行化

              • 对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。
          • 事务的四种隔离级别解决什么问题

            • 读未提交

            • 读已提交

              • 脏读
            • 可重复读

              • 不可重复读,不分幻读
            • 串行化

              • 幻读
          • 什么是脏读,幻读,不可重复读

            • 脏读:读到了别人还没提交的数据(对方回滚后,你读到的是“脏”的)。

            • 不可重复读:同一事务里,两次读同一行,结果不一样(别人中间提交了更新)。

            • 幻读:同一事务里,两次按条件查询,第二次多/少了几行(别人中间插入/删除了满足条件的行)。

          • 四种隔离级别实现原理

            • 可重复读:执行事务前创建一个视图,访问的时候以视图的逻辑结果为主,整个事务期间都会使用这个视图

            • 读已提交:视图在SQL执行前开始创建

            • 读未提交:直接返回记录的最新值

            • 串行化:对于记录进行加锁

          • 为什么可重复读不能解决幻读的问题,如何解决

            • 快照读

              • 普通select语句,通过MVCC方式解决了幻读
            • 当前读

              • select for update 语句,此类语句会跳过视图,直接读记录

              • 解决方案:需要通过间隙锁和 Next-Key Lock解决,这是InnoDB在可重复读的级别下额外引入的机制

                • 间隙锁

                  • 锁住一个范围内的”空隙”,阻止其他事务在这个范围内插入新行
                • Next-Key Lock

                  • 行锁 + 间隙锁,锁住行本身及其前面的间隙
                • 为什么单纯的间隙锁无法解决幻读?

                  • 间隙锁锁的是开区间的记录,不包含端点(记录本身) 间隙锁之间不互斥,两个事务可以同时持有同一个间隙的间隙锁。 间隙锁的设计目标是”阻止插入”,而不是”互斥访问” 间隙锁可以解决 防止插入新行 不能解决 防止修改已有行,单独解决幻读
        • 一致性 C

      • 三、Redo Log

        • 组成

          • Redo Log Buffer

          • Redo Log File

        • 写入策略

          • innodb_flush_log_at_trx_commit
      • 四、Undo Log

        • 作用

          • 事务回滚

          • MVCC 多版本读

        • 类型

          • Insert Undo Log

          • Update Undo Log

        • Purge 线程清理

      • 五、事务控制语句

        • BEGIN / COMMIT / ROLLBACK

        • SAVEPOINT

        • SET TRANSACTION

      • 六、隐式提交的 SQL

      • 七、事务隔离级别

        • READ UNCOMMITTED

        • READ COMMITTED

        • REPEATABLE READ

        • SERIALIZABLE

      • 八、分布式事务

        • XA 事务

        • 两阶段提交

      • 九、长事务

        • 危害

        • 如何避免