- InnoDB索引概述
- 常见索引:B+ 树索引;全文索引;哈希索引
- 哈希索引:自适应的索引,根据表的使用情况自动创建,不能人为干预
- B+ 树索引:结构类似于二叉树,根据键值快速找到 。
- B+ 树索引并非根据键值直接找到行,而是根据找到行所在的页,再把页加载到内存中,从内存中查找
- 常见索引:B+ 树索引;全文索引;哈希索引
- 平衡二叉树
- B+ 树
- 新增:B+树总是保持平衡,但是为了避免页的拆分,在Leaf Page已满时,先将记录平移到兄弟节点再做旋转操作
- 删除
- B+ 树索引
- 高度为2-4层,查找某行记录最多只需要2-4次IO
- 聚集索引:叶子节点包含行数据
- 非聚集索引:叶子节点不包含行数据,包含聚集索引信息
- 索引的分裂:todo
- 索引管理
- 主键索引的添加或删除操作过程:
- 创建临时表,表结构为ALTER TABLE新定义的结构
- 导入原表数据到临时表
- 删除原表
- 临时表重命名为原表 缺点:对于大表的删除和添加操作需要很长时间,若有大量事务需要访问正在修改的表,导致数据库不可用
- Fast Index Creation(快速创建索引)
- InnoDB 1.0.x开始支持
- 对辅助索引创建,添加S锁,在创建过程中不需要另外创建表,速度快,数据库可用性也得到提高
- 删除辅助索引只需要更新内部视图,并将辅助索引的空间标记为可用,同时删除MySQL数据库内部视图上对该表的索引定义引用
- 因为加了S锁,所有只能进行读操作
- 只针对辅助索引
- Online DDL
- MySQL 5.6后支持
- 允许辅助索引创建的同时,进行INSERT,UPDATE,DELETE这类DML操作
- 支持操作
- 辅助索引的创建和删除
- 改变自增长值
- 添加或删除外键约束
- 列的重命名
- 原理:将DML操作日志写入到一个缓存中,完成索引创建后,通过重做日志达到数据库的最终一致性。所占用的缓存空间通过参数innodb_online_alter_log_max_size控制,默认128MB
- Cardinality(基数)
- 表示索引中不重复记录数量的预估值,该值越高说明使用该索引查询性能越高
- 判断选择哪个索引查询更高效,是通过分析Cardinality实现
- 更新Cardinality信息策略:
- 表中1/16的数据已发生过变化
- stat_modified_counter(单行更新次数)>2000000000
- Cardinality信息的统计和更新操作通过采样获取。
- 取得B+树中叶子节点的数量记为A
- 随机取B+树索引中的8个叶子节点(Leaf Page),统计不同记录个数,即为P1,P2,...,P8
- 根据采样信息得出Cardinality的预估值为(P1+P2+...+P8)*A/8
- 联合索引
- 覆盖索引
- 防止回表,通过辅助索引就能得到所有信息,无需再通过聚集索引再次执行IO操作
- 主键索引的添加或删除操作过程: