数据库索引

1.索引

为了提升查询效率

2.代价

空间代价:创建索引需要消耗空间
时间代价:增加了增删改操作的开销,还需要修改索引.

小总结
- 多数场景中查的场景很多,所以引入索引还是很划算的
- 创建索引最好在创建表时就弄好, 否则针对一个已经有很多记录的表来创建索引也是很危险的,此时会吃掉大量的磁盘IO, 花很长时间,在此期间数据库是无法被正常使用的.
- 根据某一列创建索引也是有讲究的,比如给性别创建就意义不大.
- 主键,unique,外键都会自动创建索引
- 创建好索引后之后的查询都自动走索引, 不好预期结果,可以使用 explain 关键字显示出查询过程中具体的使用索引的情况


3.索引在MySQL背后的数据结构 — B+树

  • 哈希表(基于数组和链表实现,根据下标可快速定位)查找元素的时间复杂度是O(1), 但是哈希表只能比较是否相等,无法进行< >这样的范围查询
  • 二叉搜索树查找元素的时间复杂度O(N)(最坏单枝树,此时相当于链表),如果是AVL/红黑树可以达到O(logN),此时可以进行范围查询了,但是二叉意味着元素个数增加时树的高度增加,树的高度决定了查询时元素的比较次数.(数据库进行比较需要读硬盘的)
  • 所以我们采用N叉搜索树,降低树的高度.其中一种典型实现就是B树(也就是B-树),每个节点包含N个key,划分出N+1个区间,对应N+1个子树

B树
比较次数虽然没咋减少(一个节点上可能要比较多次), 但是读写硬盘的次数减少了(每个节点都是在硬盘上的)

  • B+树是对B树进一步改进

B+树也是一个N叉搜索树,每个节点包含N个key,划分出N个区间,最后一个key是最大值
父元素的key会在子元素中作为最大值重复出现, 这样就会导致最终的叶子节点会包含所有数据
把叶子节点用类似链表的方式首尾相连

B+树
B+树特点总结:

1.作为N叉搜索树,降低了树的高度,减少了硬盘IO次数(同B树)
2.更适合进行范围查询
3.最终查询都要落在叶子节点, 中间的比较次数都差不多,查询比较均衡(即B+树查询基本速度一样)
4.由于所有key都会在叶子节点体现,所以只需要把数据放在叶子节点上即可. 非叶子节点只存了一些简单的ID, 这也意味着非叶子节点占用的空间大大减少,有可能放进内存中的缓存,更进一步降低了磁盘IO


总结:
提升查询速度,本质上就是在减少磁盘的IO次数. MySQL的InnoDB存储引擎里所使用的典型数据结构就是B+树.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值