4-数据库索引学习笔记(上)

索引的目的:提高数据查询的效率;

可提高读写效率的数据结构有:哈希表、有序数组、搜索树:

  1. 哈希表:以键值(key-value)存储数据的结构,输入待查找的值key,就可以找到对应的Value。思路是,把值放在数组里,用哈希函数把key换算成一个确定的位置,然后把value放在该位置。当多个key值经过哈希函数的换算后,可能会出现同一个值的情况,这时候需拉出一个链表,然后顺序遍历查找匹配的用户。适用于:等值查询的场景。不适于范围查询。
  2. 有序数组在等值查询和范围查询都很优秀,有序数组查找用二分法,时复O(logN)。但如果需要更新数据就需要记录挪动来修改,成本高。适用于:静态存储引擎。比如保存了不再修改的数据。
  3. 二叉搜索树:左儿子小于父节点,父节点又小于右儿子。搜索的时复为O(logN),前提是需保持是平衡二叉树,为了保持是平衡二叉树,调整的时复为O(logN)。二叉搜索树搜索效率最高,但大多数数据库不使用二叉树,因为索引不止存于内存,还要写到磁盘。
  4. N叉树,例如N=1200,那么当树高为4,可以存1200的3次方个值,考虑到树根的数据块总在内存中,则查一个值最多3次访问磁盘。N叉树在读写上的性能优势,及适配磁盘的访问模式,被广泛用于数据库引擎中。

在MySQL中,索引在存储引擎层实现,不同存储引擎的索引的工作方式不同。即使多个引擎支持同一种类型的索引,其底层实现也不一定相同。

InnoDB的索引模型:

  1. InnoDB使用B+树索引模型,表根据主键顺序以索引的形式存放,该存储方式的表称为索引组织表。数据存放于B+树中。
  2. 根据叶结点内容,索引类型分为主键索引(聚簇索引)和非主键索引(二级索引)。
  3. 主键索引的叶结点存的是整行数据。
  4. 非主键索引的叶结点存的是主键的值,非主键索引需要多扫描一棵索引树,因此尽量使用主键索引

索引维护

  1. 当数据所在数据页满了的时候,根据B+树算法,会申请一个新数据页,挪动部分数据过去,称为页分裂。性能会降低,且空间利用率降低约50%;
  2. 相邻两个页由于删除了数据,利用率很低,将数据页合并。
  3. 主键长度越小,普通索引的叶子结点越小,普通索引所占用空间越小。从性能和空间考虑,自增主键是合理的选择。

KV场景:只有一个索引,且该索引必须是唯一索引。考虑将该索引设置为主键,可以避免每次查询需要搜索两棵树。

小结:B+树能够很好的配合磁盘读写,减少单词查询的磁盘访问次数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值