点击上方“方志朋”,选择“设为星标”

回复”666“获取新整理的面试资料

来源:http://tinyurl.com/y5ymnj9a

  • 一、索引的分类

  • 二、索引的底层实现

  • 三、问题


看了很多关于索引的博客,讲的大同小异。但是始终没有让我明白关于索引的一些概念,如B-Tree索引,Hash索引,唯一索引....或许有很多人和我一样,没搞清楚概念就开始研究B-Tree,B+Tree等结构,导致在面试的时候答非所问!本文中有关存储引擎请查看MySQL存储引擎-InnoDB和MyISAM

索引是什么?

索引是帮助MySQL高效获取数据的数据结构。

索引能干什么?

提高数据查询的效率。

索引:排好序的快速查找数据结构!索引会影响where后面的查找,和order by 后面的排序。

一、索引的分类

1️⃣从存储结构上来划分:BTree索引(B-Tree或B+Tree索引),Hash索引,full-index全文索引,R-Tree索引。

2️⃣从应用层次来分:普通索引,唯一索引,复合索引

3️⃣根据中数据的物理顺序与键值的逻辑(索引)顺序关系:聚集索引,非聚集索引。

1️⃣中所描述的是索引存储时保存的形式,2️⃣是索引使用过程中进行的分类,两者是不同层次上的划分。不过平时讲的索引类型一般是指在应用层次的划分。

就像手机分类:安卓手机,IOS手机 与 华为手机,苹果手机,OPPO手机一样。

普通索引:即一个索引只包含单个列,一个表可以有多个单列索引

唯一索引:索引列的值必须唯一,但允许有空值

复合索引:即一个索引包含多个列

聚簇索引(聚集索引):并不是一种单独的索引类型,而是一种数据存储方式。具体细节取决于不同的实现,InnoDB的聚簇索引其实就是在同一个结构中保存了B-Tree索引(技术上来说是B+Tree)和数据行。

非聚簇索引:不是聚簇索引,就是非聚簇索引(认真脸)。

二、索引的底层实现

mysql默认存储引擎innodb只显式支持B-Tree( 从技术上来说是B+Tree)索引,对于频繁访问的表,innodb会透明建立自适应hash索引,即在B树索引基础上建立hash索引,可以显著提高查找效率,对于客户端是透明的,不可控制的,隐式的。

不谈存储引擎,只讨论实现(抽象)

Hash索引

基于哈希表实现,只有精确匹配索引所有列的查询才有效,对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hash code),并且Hash索引将所有的哈希码存储在索引中,同时在索引表中保存指向每个数据行的指针。

img

B-Tree索引(MySQL使用B+Tree)

B-Tree能加快数据的访问速度,因为存储引擎不再需要进行全表扫描来获取数据,数据分布在各个节点之中。

img

B+Tree索引

是B-Tree的改进版本,同时也是数据库索引索引所采用的存储结构。数据都在叶子节点上,并且增加了顺序访问指针,每个叶子节点都指向相邻的叶子节点的地址。相比B-Tree来说,进行范围查找时只需要查找两个节点,进行遍历即可。而B-Tree需要获取所有节点,相比之下B+Tree效率更高。

img

结合存储引擎来讨论(一般默认使用B+Tree)

案例:假设有一张学生表,id为主键

id name birthday
1 Tom 1996-01-01
2 Jann 1996-01-04
3 Ray 1996-01-08
4 Michael 1996-01-10
5 Jack 1996-01-13
6 Steven 1996-01-23
7 Lily 1996-01-25

在MyISAM引擎中的实现(二级索引也是这样实现的)

img

在InnoDB中的实现

img

img

三、问题

问:为什么索引结构默认使用B-Tree,而不是hash,二叉树,红黑树?

hash:虽然可以快速定位,但是没有顺序,IO复杂度高。

二叉树:树的高度不均匀,不能自平衡,查找效率跟数据有关(树的高度),并且IO代价高。

红黑树:树的高度随着数据量增加而增加,IO代价高。

问:为什么官方建议使用自增长主键作为索引。

结合B+Tree的特点,自增主键是连续的,在插入过程中尽量减少页分裂,即使要进行页分裂,也只会分裂很少一部分。并且能减少数据的移动,每次插入都是插入到最后。总之就是减少分裂和移动的频率。

插入连续的数据:

img

插入非连续的数据

热门内容:   

  

  • 一次 Jar 包升级引发的血案 & 解决

  • 如何优雅的导出 Excel

  • JDK 13 新特性一览

  • 某小公司RESTful、共用接口、前后端分离、接口约定的实践

  • 请停止学习框架

  • IntelliJ IDEA 2019.3这回真的要飞起来了,新特性抢先看!

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)ノ♡

图解 MySQL 索引:B-树、B+树相关推荐

  1. 为什么MySQL索引要使用 B+树,而不是其它树形结构?

    一个问题? InnoDB一棵B+树可以存放多少行数据?这个问题的简单回答是:约2千万 为什么是这么多呢? 因为这是可以算出来的,要搞清楚这个问题,我们先从InnoDB索引数据结构.数据组织方式说起. ...

  2. 16kb等于多少b_面试官:MySQL索引为何选择B+树?

    声明 本文所述的各种数据结构(二叉树等),均不考虑重复值的情况,本文简述各种数据结构的区别仅仅只是为了理解MySQL索引的需要而做的铺垫. 什么是索引 提起索引,大家都知道,建立索引可以让数据库查询更 ...

  3. MySQL索引底层:B+树详解

    前言 当我们发现SQL执行很慢的时候,自然而然想到的就是加索引.对于范围查询,索引的底层结构就是B+树.今天我们一起来学习一下B+树哈~ 树简介.树种类 B-树.B+树简介 B+树插入 B+树查找 B ...

  4. mysql为什么不使用二叉树,MYSQL 索引为什么使用B+树,而不是 B 树,二叉树:

    如何评价索引的好坏: 数据库服务器有两种存储介质,硬盘和内存,为了数据安全,索引需要存放在硬盘上,这样在硬盘上进行查询时,就会产生硬盘的I/O操作,索引的查找次数也就是硬盘I/O的操作次数,所以索引需 ...

  5. 图解 MySQL 索引:B-树、B+树,终于搞清楚了!

    看了很多关于索引的博客,讲的大同小异.但是始终没有让我明白关于索引的一些概念,如B-Tree索引,Hash索引,唯一索引-. 或许有很多人和我一样,没搞清楚概念就开始研究B-Tree,B+Tree等结 ...

  6. 图解MySQL索引:B-树(B+树)

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:收藏了!7 个开源的 Spring Boot 前后端分离优质项目个人原创+1博客:点击前往,查看更多 作者:浪人 ...

  7. Mysql 索引为啥使用B+树?不用哈希或B树?红黑树?

    哈希索引:单个记录的增删改查效率高,时间复杂度是O(1):但对于范围查询需要全表扫描: B树: 1 范围查询时效率比B+树低(B树的叶子结点缺少有序链表): 2 内部节点(非叶子结点)既存储数据也存储 ...

  8. 为什么MySQL索引更适合B+树而不是二叉树、B树

    一 数据库为什么使用B+树 1. 与二叉树相比 二叉树相比于顺序查找的确减少了查找次数,但是在最坏情况下,二叉树有可能退化为顺序查找.而且就二叉树本身来说,当数据库的数据量特别大时,其层数也将特别大. ...

  9. mysql索引背后的数据结构_图解Mysql索引的数据结构!看不懂你来找我

    听说微信搜索<Java鱼仔>会变更强哦! 本文收录于JavaStarter ,里面有我完整的Java系列文章,学习或面试都可以看看哦 (一)关于索引 索引是帮助Mysql更加高效获取数据的 ...

最新文章

  1. 交叉验证分析每一折(fold of Kfold)验证数据的评估指标并绘制综合ROC曲线
  2. 生成可执行jar文件
  3. 局域网服务器共享文件怎么设置,【局域网共享文件】局域网如何文件共享_局域网共享设置文件夹_佰佰安全网...
  4. 怎么break java8 stream的foreach
  5. sqlserver死锁解决的存储过程
  6. oidc auth2.0_使用Spring Security 5.0和OIDC轻松构建身份验证
  7. html 网页制作标签,html网页制作标签最全版.doc
  8. 原来每天喝它有助于大脑开发?
  9. 最全攻略:数据分析师必备Python编程基础知识
  10. nvme驱动_用户态NVMe运维利器 SPDK NVMe 字符设备
  11. 【直播预告】腾讯广告实时策略数据框架建设
  12. 链表的中间节点--快慢指针
  13. 面试官的几句话,差点让我挂在HTTPS上
  14. RAID磁盘阵列的部署(red hat 6.5)
  15. matlab-排队模型和排队系统仿真
  16. 微pe工具箱 系统安装教程_通用PE工具箱装系统(V4.0)——安装原版WIN7系统
  17. 韩顺平老师php从入门到精通149讲
  18. 如何查看steam游戏销量_如何查看您在Steam游戏上花费的金钱和时间
  19. c语言双向循环链表存储长整型,湖南工程学院15级C语言课程设计报告.doc
  20. 19年12月六级翻译词汇

热门文章

  1. 简述BT下载技术及其公司发展现状
  2. Android与iOS对比
  3. Linux sendmail发送邮件失败诊断案例(一)
  4. 架构师的第一阶段:准备做(Pre-Architecture)
  5. 【POJ/算法】 3259 Wormholes(Bellman-Ford算法, SPFA ,FLoyd算法)
  6. 开源大咖齐聚2020启智开发者大会,共探深度学习技术未来趋势
  7. Facebook面经全披露,我是怎么拿到机器学习工程师offer的?
  8. MaskFlownet:基于可学习遮挡掩模的非对称特征匹配丨CVPR 2020
  9. AI新基建如何构建?浪潮给出了一个答案
  10. 关于正则表达式,这篇都讲清楚了