1. 位图索引
1.1. 结构
1.1.1. 位图片段<key, start rowid, end rowid, bitmap>
1.1.2. 一"种"key对应多行
1.1.3. 与B树扫描方式不同,位图索引核心操作是位运算
1.2. 特点
1.2.1. 支持null值
1.2.2. COUNT AND OR操作效率极高,多个索引列可共同作用
1.2.3. 占用空间很小
1.2.4. 对DML极不友好,锁等待
1.2.4.1. insert into Table(sex) values('男'),事务提交前会阻塞所有其他sex='男'的插入/更新;
1.2.4.2. 从key1 update到key2甚至会阻塞所有涉及到key1 key2的插入/更新
1.2.5. 是一种适应范围比较窄,但是特效针对性很强的索引类型
1.3. 应用场景
1.3.1. 列的基数少(重复率高)、可枚举
1.3.1.1. 典型应用: 性别、婚否、状态
1.3.2. 索引列数据极少更新
1.3.3. 适合DSS, OLAP系统
2. 函数索引
2.1. 前置知识
2.1.1. 对索引列做运算让索引失效
2.1.2. 尽量避免列运算(通过转换SQL写法)
2.2. 特点
2.2.1. 性能介于BTREE索引与全表扫描
3. BTREE索引
3.1. 结构
3.1.1. 数据结构:平衡多路查找树
3.1.1.1. 高度低、自动层次控制
3.1.1.2. 查找与写入性能 O(log2N)
3.1.1.3. 插入时节点可能分裂,删除时可能合并
3.1.2. 叶子节点存储:索引列值 + rowid
3.2. 三大特点
3.2.1. 高度低
3.2.1.1. e.g. 对索引列做等值查询时,50w与500w数据量几乎无区别(若在索引树中高度相同,执行效率完全一样)
3.2.1.2. e.g. 数百亿数据量在索引里高度可能才6层
3.2.1.3. IO次数估算*
3.2.2. 存储列值
3.2.2.1. 只查询索引列字段不必回表
3.2.2.2. COUNT利用索引的条件
3.2.2.2.1. 指定列非空:比如 sql的where中,带比较符号 = or < or > ,自然排除了null值
3.2.2.2.2. 或者索引列本身有not null约束
3.2.2.3. SUM/AVG利用索引条件
3.2.2.3.1. 同COUNT
3.2.2.3.2. 技巧:SUM AVG 和COUNT可以写在一起,一次索引扫描即可查出来
3.2.3. 索引有序
3.2.3.1. Min/Max可直接利用索引
3.2.3.1.1. 索引列是否有null不影响
3.2.3.1.2. 查找时,直接找向索引树的最左/最右端,逻辑读很低
3.2.3.1.3. 陷阱:对同一索引字段同时查最小值和最大值,不会走索引 select min(a), max(a) from table
3.2.3.2. 排序相关语句可通过索引优化
3.2.3.2.1. order by
3.2.3.2.2. distinct
3.2.3.2.3. union
3.3. 组合索引
3.3.1. 组合列返回结果越少越高效
3.3.2. 第一列可作为单列索引
3.3.3. 避免回表
3.3.3.1. 典型案例: 若频繁使用select id, name from xxx 可以将(id, name)作为组合索引,避免name字段的回表读
3.3.4. 建立原则
3.3.4.1. 优先照顾第一列
3.3.4.2. 重复记录少的字段在前(利于范围查询)
3.3.4.3. 一列等值一列范围查找: 等值查找的列在前
3.3.4.4. 索引列不宜过多,建议<=3
3.4. 聚合因子
3.4.1. 定义:表明有多少临近的索引条目指到不同的数据块(类比windows磁盘碎片整理)
3.4.2. 影响回表查询的速度
3.4.3. 可通过重组表记录优化