mysql 索引原理

118 阅读2分钟
  • 索引:数据结构,占用存储空间,提升查询效率
  • 种类:
    • 哈希索引: // HashMap 底层:数组+链表fdsdsfdfd
      • 基础索引 key value
      • key: 定位value的位置
      • value: 存储的数据
      • 时间复杂度: IO 次数
        • 极高 O(1)
      • 特点:单值查询效率极高
      • 问题:不适合范围查询,不适合排序
    • 二叉树:(二叉搜索树)
      • 概念:本身有序,
      • 时间复杂度: IO 次数 *
      • 特点:范围查询时,相较于哈希索引,IO次数减少,查询效率提高
      • 特点:适用于范围,排序
      • 问题:
        • 数据量大时,树高,IO次数高,效率低
        • 二叉树退化(数据量不平衡),类似链表
    • 平衡二叉树 (类似:红黑树)
      • 概念:基于二叉树进行自动平衡,降低树高
      • 问题:
        • 数据量大时,树高,IO次数高,效率低
    • 平衡树 (B树)
      • 概念:基于平衡二叉树,提升子节点数量
        • 层:树高
        • 阶:节点拥有子节点数量
      • 特点:索引+数据存储在一起,树低,
      • 问题:节点大,每次IO读取节点数量有限
    • B+ 树
      • 概念:基于B树,仅叶子节点存储数据,可用一次读取所有索引数据
      • 问题:
        • 不适合模糊查询
    • 倒排索引
      • 特点:用于模糊查询

          * SQL 语句解析顺序
        
    • MySql 逻辑架构
      • 连接层
        • 和外部建立连接,并管理连接
      • 服务层
        • sql解析,验证,优化
        • 命中索引,缓存
      • 引擎层
        • 确认存储引擎 如: InnerDB, Myisam, 黑洞, 内存, csv
      • 持久层
        • 数据持久化
    • sql 语句解析 (服务层)
      • 语句: select * from xx left join on xx where xx order by xx limit 0,10
        1. 解析 from 后面表,优先解析驱动表,形成临时表t1
        1. 解析 join on, 通过 on 筛选,得到临时被驱动表t2
        • t1,t2 根据 join 条件,笛卡尔积,形成临时表t3
          • 临时表t3 所有表自动和复合条件的数据
        1. 解析 where ,使用字段进行筛选,形成临时表t4
        • 临时表t4 为全部符合条件的数据
        1. 解析 select, 保留选择字段,丢弃其他字段,得到t5
        • 写 * 号,需要替换两表所有列,取别名,消耗性能
        1. 解析 order by 和 limit
    • 索引影响 (5个方面)
      • on 条件要加索引: 被驱动表加索引,提升筛选效率
      • 在 where 加索引
      • select 不写 *:
          1. 增加替换过程
          1. 数据变大
          1. 尽量将 order by 字段查询出来
      • order by 字段 最好是 select 的字段(否则重新加载)
        • 最好是索引字段(索引)
      • limit 最好加上,限制返回总数