mysql索引,事务,日志相关原理

数据库是后端开发不可或缺的存储组件,本文详细介绍了数据库索引,事务,日志等核心原理,掌握原理,才能更好的开发上层应用

  • mysql
    • 索引
      • 索引的概念
      • 索引的类型
        • 主键索引
        • 唯一索引
        • 普通索引
        • 全文索引
        • 组合索引
        • 哈希索引
      • 索引的实现方式
        • B-Tree 索引
        • Hash 索引
        • Full-text 索引
        • R-Tree 索引
      • 索引的优缺点
        • 优点
          • 提高查询效率
          • 减少IO操作
        • 缺点
          • 增加写操作的成本
          • 占用更多的存储空间
          • 可能会导致性能下降
      • 索引的使用注意事项
        • 索引的选择和创建
        • 索引的使用规则
        • 索引的维护
      • 索引的性能优化
        • 索引覆盖
        • 聚簇索引
        • 避免过度索引
        • 索引下推
      • 索引的常见问题和解决方法
        • 索引失效
        • 索引不当使用
        • 索引过多
        • 索引碎片化
      • 索引在数据库优化中的应用
        • 查询优化
        • 数据库设计优化
        • 数据库运维优化
    • 事务
      • 事务的概念
        • 事务的定义
        • 事务的特性
      • MySQL 存储引擎
        • 存储引擎的定义
        • InnoDB 存储引擎的特点
      • MySQL 的事务实现
        • 事务日志
        • undo 日志
        • redo 日志
        • MySQL 的 MVCC 实现
      • 事务的隔离级别
        • 读未提交
        • 读已提交
        • 可重复读
        • 串行化
      • 死锁的处理
      • 事务的应用
        • 手动提交事务
        • 自动提交事务
        • 回滚事务
    • 日志/持久化
      • 什么是binlog
        • binlog的概念和作用
        • binlog的存储位置和格式
      • binlog的类型
        • statement格式
        • row格式
        • mixed格式
      • binlog的写入
        • binlog的写入时机和条件
        • binlog的写入方法和原理
      • binlog的读取和解析
        • binlog的读取方法和原理
        • binlog的解析工具和使用方法
      • binlog的应用场景
        • 数据库备份和恢复
        • 数据库主从同步
        • 数据库数据分析和迁移
      • binlog的性能优化
        • binlog的大小和性能关系
        • binlog的滚动和清理策略
        • binlog的异步写入和缓冲策略
      • binlog的安全和保护
        • binlog的访问控制和加密
        • binlog的备份和恢复策略
        • binlog的灾难恢复和应急响应

索引

索引的概念

  • 索引是用于对数据库数据快速检索的数据结构,存储在磁盘上,不需要全部载入内存,在使用时按需读入内存。说白了,就是可以给数据库的数据在不同纬度(字段)上加上一个数据结构,能快速的根据这个纬度定位到特定的数据

  • 因此,评价一个索引的效率,io次数(从磁盘读取索引到内存的次数)就是一个很重要的指标。

  • 如果在一个很大的字段上建立了索引,就会导致索引树的层数变高io次数变高,导致效率变低

索引的类型

主键索引

  • 在主键上建立的索引
  • 如果一个表没有主键,innodb会自动分配一个整形的主键,因此,一般数据库建议都显式的加上整形的自增主键,如果有其他字段,也是唯一的,建议是同样加上一个自增主键,再建立一个唯一索引,因为,如果另外的字段不是整形,那么直接做主键索引,可能占用的空间更大,当回表的时候,效率变低

    唯一索引

  • 索引所在一个或者多个列的数据组成,是唯一的,主键索引一定是唯一索引

    普通索引

  • 数据不是唯一的,这种索引当数据重复度很大时,效率不高

    全文索引

  • 倒排索引
  • 涉及到全文索引的,一般都用es

    组合索引

  • 多个字段上组合建立的索引,查询时遵从最左匹配原则,指的是索引建立的时候的字段左右,不是查询的时候

    哈希索引

  • myisam使用的索引,innodb都是B+树
  • hashtable

聚簇索引/非聚簇索引

  • 叶子结点存的就是数据,innodb主键索引是聚簇索引,没有指定主键,会自动创建一个6字节的字增id,用于聚簇索引
  • myIsam使用B+树构建索引时,叶子结点存的数据为磁盘地址,所以是使用的非聚簇索引
  • 非聚簇索引存的是指向数据的指针,可以理解还要经过一次地址才能访问到数据
  • innodb的非主键索引,存的是主键id,这个应该也不能称为聚簇索引

索引的实现方式

B-Tree 索引

  • 数据都存在叶子结点,主键索引叶子结点存数据,非主键索引叶子结点存主键id
    • 因此主键值改变的时候,需要更新所有索引保存的主键值
  • 本身是有序树,结点内也是有序的,二分查找
  • 叶子结点之间,双向链表,方便遍历,范围查询,排序
  • 支持前缀查询like xx%,

Hash 索引

  • hashtable为底层数据结构,需要全部载入内存
  • 范围查询只能全表扫描

Full-text 索引

  • 倒排索引

R-Tree 索引

待定

https://cloud.tencent.com/developer/article/2121055
https://www.cnblogs.com/xuwc/p/13873293.html
https://juejin.cn/post/7092056967216119845
https://www.cnblogs.com/qdhxhz/p/15598873.html

codelover wechat
原创公众号
-----若有不妥,敬请斧正-----