索引分类
哈希索引 B-tree索引 B+tree索引
哈希索引与B树索引区别
- 哈希索引存在哈希冲突,一般解决冲突的方法是链地址法,即发生冲突时,形成链表。但链表的存在会降低查询效率;
- 哈希索引对于单个的值查找非常快;
- 哈希索引无法进行范围查找,以及对数据进行排序;
- B树索引查询效率不如哈希索引,但是支持范围查找以及排序;
B-树与B+树的区别
- 主要区别是在于数据存储方式不同;
- B-树的所有节点,既存放key,也存放data,B+树只有叶子节点存放key和data,其他节点只存放key;
- B-树的叶子节点是独立的,B+树的叶子节点有一条引用链指向与它相邻的叶子节点;
- B-树的检索的过程相当于对范围内的每个节点的关键字做二分查找,可能还没有到达叶子节点,检索就结束了。而 B+树的检索效率就很稳定了,任何查找都是从根节点到叶子节点的过程,叶子节点的顺序检索很明显。
聚簇索引与非聚簇索引
聚簇索引:聚集索引即索引结构和数据一起存放的索引
优缺点:
- 聚集索引的查询速度非常的快,因为整个 B+树本身就是一颗多叉平衡树,叶子节点也都是有序的,定位到索引的节点,就相当于定位到了数据。
- 依赖于有序的数据 :因为 B+树是多路平衡树,如果索引的数据不是有序的,那么就需要在插入时排序,如果数据是整型还好,否则类似于字符串或 UUID 这种又长又难比较的数据,插入或查找的速度肯定比较慢。
- 更新代价大 : 如果对索引列的数据被修改时,那么对应的索引也将会被修改,而且聚集索引的叶子节点还存放着数据,修改代价肯定是较大的,所以对于主键索引来说,主键一般都是不可被修改的。
非聚簇索引:非聚集索引即索引结构和数据分开存放的索引
优缺点:
- 更新代价比聚集索引要小 。非聚集索引的更新代价就没有聚集索引那么大了,非聚集索引的叶子节点是不存放数据的。
- 跟聚集索引一样,非聚集索引也依赖于有序的数据。
- 可能会二次查询(回表) :这应该是非聚集索引最大的缺点了。 当查到索引对应的指针或主键后,可能还需要根据指针或主键再到数据文件或表中查询。
主键索引与辅助索引
主键索引:数据表的主键列使用的就是主键索引,叶子节点存储的是除主键外的数据行
辅助索引:叶子节点存储的数据是主键,通过索引,定位主键的位置
覆盖索引
覆盖索引:覆盖索引即需要查询的字段正好是索引的字段,那么直接根据该索引,就可以查到数据了, 而无需回表查询。
索引下推
索引下推:索引下推是 MySQL 5.6 版本中提供的一项索引优化功能,可以在非聚簇索引遍历过程中,对索引中包含的字段先做判断,过滤掉不符合条件的记录,减少回表次数。
索引失效的条件
- 使用 is null
- 使用!= 或者 <> 导致索引失效
- mysql的隐式转换,类型不一致导致的索引失效,如:int 和varchar
- 函数导致的索引失效
- 运算符导致的索引失效
- OR引起的索引失效
- 模糊搜索导致的索引失效
- 使用NOT IN、NOT EXISTS导致索引失效
- 对联合索引来说,查询条件不符合最左前缀匹配原则
|