推荐一个学习树结构的网站 --> 树结构学习网站

本文目录:

  1. 二叉树
  2. 红黑树
  3. Hash表
  4. B树
  5. B+树
  6. 聚簇索引
  7. 非聚簇索引
  8. 联合索引

一. 二叉树

插入顺序: 4 2 1 10 6 7
首先, 左侧叶子节点 < 主节点 < 右侧叶子节点
我们乱序插入一些数据, 我们会发现0010这个节点被“孤立”了, 随着数据量的增加树的H(高度)会随之增加, 当我们加到了N的数据量后, 我们再查询这个N. 那么这个树搜索会从根直至到N这个位置, 对于自增的表列而言, 并没有明显提供查询性能. 而且有些节点甚至可能会独立存在, 拉高了树的H.

二. 红黑树

插入顺序: 4 2 1 10 6 7
我们会发现这棵树, 在添加的过程中, 会字段平衡节点与叶子节点之间的关系, 当一侧单向高时, 会把大于和小于的节点提上来, 左面是小于这个节点的, 右面是大于这个节点的, 它相比于二叉树, 有了一个自动平衡的功能, 但是与二叉树有一个相同的特点, 虽然数据量的增加树的高度会无限增加. 所以数据库的索引不会使用这个红黑树, 而JDK8的hashMap是数组+红黑树, 每个bucket内的红黑树节点数量也会有控制.

三. Hash表

Hash表的索引优缺点也显而易见, 对于where条件之后的=查询, 它是可以精确到桶的位置, 然后再看桶内数据哪条数据符合条件, 拿着地址去找数据.
但是缺点也很明显, hash冲突, 如果链表数据过多, 反而失去了索引的该有的优势, 而且它并不支持范围查询.

查看引擎的页大小, 大约为16K

四. B树

B树, 以自增主键举例, 15,56,77,20,49就是id值, 每一个id值下面会挂着一条数据, 主节点和叶子节点是不能重复的.

五. B+树

B+树, B树的升级版, 我们会发现相比于B树, 主节点的值是可以和叶子节点重复的, 最终会定位到最终一行上, 获取data数据. 而且data数据是一个双向链表关系. 相比于B树有什么有数呢?

  1. 主节点来看 如果主键ID是bigint类型, 那么它是8个字节, 白色的地方是指向叶子节点的地址, 在C语言中是6个字节, 那么一对就是14byte, 以页为单位, 一个页可以放16000/14=1143, 以H为3为例, 第二层的量为1143 * 1143 = 1306449, 那么第三层数据看成1KB, 那么一个页就是16条数据, H为3的话就是 1143 * 1143 * 16, 大约就是两千万的数据量, 肯定比B数结构的量多的多(B树 data以1KB算, 16000/1014=15 第二层才15*15).
  2. data双向链表就决定了B+的数据可以范围查询, 而B树有点类似与Hash表的查询了(最后一行的数据是左小右大, 但是对于范围来说查询影响不大)

六. 聚簇索引

我们先在服务器上安装一个mysql, 创建一个test数据库,
再创建一个 test_innodb的innoDB引擎的表
再创建一个test_myisam的MyISAM引擎的表
我们进入到 /var/lib/mysql路径下, 会发现以数据库命名的文件夹, 我们进到test目录下

我们发现不同引擎的数据文件是不一样的.
innoDB引擎的文件有frm和ibd, frm是表的结构数据, ibd是索引和数据的文件
MyISAM引擎的文件有frm和MYD以及MYI, frm仍然是表的结构数据, MYD是数据文件, MYI是索引数据文件.
不难发现, MyISAM将索引和数据解藕存储, 但是每次查询需要两个文件联查. 在数据量以及索引足够大时MyISAM是占优的, 但是在现如今硬件足够优秀, 以及可以控制好树的高度情况下, innoDB的效率也不会比MyISAM差. 甚至更优.

聚簇索引
通过mysql的数据文件, 我看可以看出来InnoDB的索引和数据都在.ibd文件里, 那么数据结构也就是如下, data数据就是行数据.

name字段创建B Tree索引
在聚簇索引存在下, 那么再创建索引字段, 他的结构就如下所示, 最终指向了ID的值.
从这里我们可以看出来, 创建一个表带上主键是多么的重要!!!
为什么使用自增作为主键? 如果是UUID这种, 那么树节点排序还需要计算ASCII值去比对. 相对于树结构的特性自增是很好的选择!!!

七. 非聚簇索引(MyISAM的主键索引)

我们查看数据库的MyISAM的数据文件可以知道, 索引是MYI文件, 数据文件是MYD, 那么他的结构也就是如下所示, data指向的是数据地址.

八. 联合索引(左前缀原则)

节点排列我们知道一定是顺序排列, 那么如果是多个字段做联合索引, 那么它的排列一定是一个字段排序, 相同时第二个对比, 第二个也相同再比对第三个字段数据的ASCII值.
那么我们就可以知道, 如果查询where name = 'Bill’和where name = ‘Lilei’ and age = 30是可以走索引的
如果直接where position = 'dev’是无法走索引的

索引原理-索引数据结构相关推荐

  1. 【MySQL】数据库索引原理 | 索引数据结构 | B+Tree

    数据库索引原理 | 索引数据结构 | B+Tree 文章目录 数据库索引原理 | 索引数据结构 | B+Tree 一. 数据库索引简介 二. 红黑树 与 B-Tree 1. 红黑树 2. B-Tree ...

  2. 索引介绍、索引原理、索引的数据结构(二叉排序树、平衡二叉树、B树、B+树)

    引入 本篇博客偏理论, 将会介绍一下知识: 索引介绍 索引原理 索引的数据结构(二叉树->平衡二叉树->B树->B+树) 聚集索引与辅助索引 MySQL索引管理 创建和删除索引的语法 ...

  3. 转:MySQL索引原理及慢查询优化

    来自:http://tech.meituan.com/mysql-index.html MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能出色, ...

  4. MySQL数据库学习【第九篇】索引原理与慢查询优化

    一.介绍 1.什么是索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语 ...

  5. 建立索引和主外约束_Mysql索引原理

    阅读文本大概需要3分钟. 作者:菜菜聊架构来源:https://www.cnblogs.com/caicz/p/11009507.html 一.为什么要有索引 索引在MySQL中也叫做"键& ...

  6. Python mysql 索引原理与慢查询优化

    一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句 ...

  7. cpci检索为什么那么慢_索引原理与慢查询优化

    一.前言 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句 ...

  8. (转)MySQL索引原理及慢查询优化

    转自美团技术博客,原文地址:http://tech.meituan.com/mysql-index.html 建索引的一些原则: 1.最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到 ...

  9. mysql六:索引原理与慢查询优化

    一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句 ...

最新文章

  1. 组合计数 ---- 2020 icpc 上海 The Journey of Geor Autumn(思维划分问题计数+预处理优化)
  2. Payara基金会发布全面支持MicroProfile 2.0的5.183版Payara Server和Payara Micro
  3. CodeForces - 993E Nikita and Order Statistics
  4. JS魔法堂:判断节点位置关系
  5. 限制部分Postfix用户只能内部收发的例子(完整版)
  6. SAP Customer Data Cloud(Gigya)的用户搜索实现
  7. 嵌入式开发linux工具,嵌入式Linux开发入门之MfgTool工具的使用
  8. SqlHelper 类
  9. 如何做项目竞标的PPT?
  10. 年度盘点和预测:数说汽车互联网市场
  11. Word文档换台电脑打开后字体、排版等会发生变化的原因及解决方案!
  12. 操作系统课程设计-进程管理
  13. Unity 使用教程 之 Unity3D常用的知识点归纳
  14. 深度学习 - 42.特征交叉与 SENET、Bilinear Interaction 与 FiBiNet
  15. 20个月股票投资复盘:在被割韭菜中成长
  16. 贪心——Greedy
  17. Unity-动画-动画回调函数接口StateMachineBehaviour
  18. Inno Setup字符串截取/拷贝
  19. iphone拍照的历史顽固问题-鬼影
  20. 杭州银行批量交易平台(HZBAT)技术内幕

热门文章

  1. 让数字人出圈的技术秘籍,华为率先公开了
  2. jzoj. 1285. 奶酪厂
  3. request.setHeader() 方法
  4. 百度网盘限速的解决办法
  5. js的setCapture
  6. 双向Rsync实时同步
  7. 年终盘点!2022顶会论文代码大合集!
  8. put: File COPYING could be replicated to 0 nodes instead of minReplication.There are 0 datanodes解决方案
  9. ESP32_WIFI MESH学习笔记4 MESH网WIFI桥接
  10. BIND+Mysql实现DNS轮询泛解析和IP视图