sql---索引总结

Posted 8013-cmf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql---索引总结相关的知识,希望对你有一定的参考价值。

索引:是为了提高数据查询的效率

常见模型:

  1. 哈希表(以键值对key-value存储数据的结构)
    1. 适应场景:哈希表这种结构适用于只有等值查询的场景
    2. 思路:把值放在数组里,用一个哈希函数把key换算成一个确定的位置,然后把value放在数组的这个位置
    3. 冲突的解决办法:链表
  2. 有序数组
    1. 有序数组索引只适用于静态存储引擎
    2. 按顺序存储。查询用二分法就可以快速查询
  3. 二叉搜索树
    1. 每个节点的左儿子小于父节点,父节点又小于右儿子
    2. 查询时间复杂度O(log(N)),更新时间复杂度O(log(N))
    3. 数据库存储大多不适用二叉树,因为树高过高,会适用N叉树

InnoDB 的索引模型:B+树(每一个表是好几棵B+树,B+树能够很好地配合磁盘的读写特性,减少单次查询的磁盘访问次数)

索引分为主键索引和非主键索引

  • 主键索引:叶子节点存的是整行数据,在InnoDB里,主键索引也被称为聚簇索引(clustered index)。
  • 非主键索引:叶子节点存的是主键索引的值在InnoDB里,非主键索引也被称为二级索引(secondary index)。

基于主键索引和普通索引的查询有什么区别?

  如果语句是select * from T where ID=500,即主键查询方式,则只需要搜索ID这棵B+树;

  如果语句是select * from T where k=5,即普通索引查询方式,则需要先搜索k索引树,得到ID的值为500,再到ID索引树搜索一次。这个过程称为回表。(回到主键索引树搜索的过程,我们称为回表)

维护:

一个数据页满了,按照B+Tree算法,新增加一个数据页,叫做页分裂,会导致性能下降。空间利用率降低大概50%。当相邻的两个数据页利用率很低的时候会做数据页合并,合并的过程是分裂过程的逆过程。

 select * from T where k between 3 and 5 
  1. 在k索引树上找到k=3的记录,取得 ID = 300;

  2. 再到ID索引树查到ID=300对应的R3;

  3. 在k索引树取下一个值k=5,取得ID=500;

  4. 再回到ID索引树查到ID=500对应的R4;

  5. 在k索引树取下一个值k=6,不满足条件,循环结束。

这个查询过程读了k索引树的3条记录(步骤1、3和5),回表了两次(步骤2和4)

覆盖索引:减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。

select ID from T where k between 3 and 5
--只需要查询ID值,而id值已经在k索引树上了,所以不需要回表

以上是关于sql---索引总结的主要内容,如果未能解决你的问题,请参考以下文章

MySql知识体系总结(SQL优化篇)

推荐学java——MyBatis高级

推荐学java——MyBatis高级

推荐学java——MyBatis高级

推荐学java——MyBatis高级

SQL Server索引总结二