- 索引:数据结构,占用存储空间,提升查询效率
- 种类:
- 哈希索引: // 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
-
- 解析 from 后面表,优先解析驱动表,形成临时表t1
-
- 解析 join on, 通过 on 筛选,得到临时被驱动表t2
- t1,t2 根据 join 条件,笛卡尔积,形成临时表t3
- 临时表t3 所有表自动和复合条件的数据
-
- 解析 where ,使用字段进行筛选,形成临时表t4
- 临时表t4 为全部符合条件的数据
-
- 解析 select, 保留选择字段,丢弃其他字段,得到t5
- 写 * 号,需要替换两表所有列,取别名,消耗性能
-
- 解析 order by 和 limit
- 索引影响 (5个方面)
- on 条件要加索引: 被驱动表加索引,提升筛选效率
- 在 where 加索引
- select 不写 *:
-
- 增加替换过程
-
- 数据变大
-
- 尽量将 order by 字段查询出来
-
- order by 字段 最好是 select 的字段(否则重新加载)
- 最好是索引字段(索引)
- limit 最好加上,限制返回总数
- 哈希索引: // HashMap 底层:数组+链表fdsdsfdfd