索引
二叉查找树
B-Tree
定义:
- 根节点至少包括两个孩子
- 树中每个节点最多含有m个孩子(m>=2)
- 除根节点和叶节点外,其它每个节点至少有ceil(m/2)个孩子
- 所有叶子节点都位于同一层
B+-Tree
B+树是B树的变体,其定义基本与B树相同,除了:
- 非叶子节点的子树指针与关键字个数相同
优点:
- B+树的磁盘读写代价更低
- B+树的查询效率更加稳定
- B+树更有利于对数据库的扫描
Hash索引
缺点:
- 仅仅能满座”=”,”in”,不能使用范围查询
- 无法被用来避免数据的排序操作
- 不能利用部分索引键查询
- 不能避免表扫描
- 遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高
BitMap索引
密集索引与稀疏索引
- 密集索引文件中的每个搜索码值都对应一个索引值
- 稀疏索引文件只为索引码的某些值建立索引项
InnoDB
- 若一个主键被定义,该主键作为密集索引
- 若没有主键被定义,该表的第一个唯一非空索引作为密集索引
- 若不满做以上条件,innodb内部会生成一个隐藏主键(密集索引)
- 非主键索引存储相关键位和其对应的主键值,包含两次查找
问题
- 如何定位并优化慢查询
- 根据慢日志定位慢查询sql
- 开启慢查询日志
set global slow_query_log = on;
- 设置慢查询时间
set global long_query_time = 1;
- 开启慢查询日志
- 使用explain等工具分析sql
- type:找到数据行的方式
- extra
- 修改sql或者尽量让sql走索引
- 根据慢日志定位慢查询sql
- 联合索引的最左匹配原则
- 索引是建立得越多越好码
- 数据量小的表不需要建立索引,建立索引会增加额外的索引开销
- 数据变更需要维护索引,因此更多的索引意味着更多的维护成本
- 更多的索引意味着y更多的空间