索引数据结构

1、 二叉搜索树(Binary Search Tree)二叉搜索树是每个节点最多有两个子节点的树,按照右侧子节点大于本节点,左侧子节点小于本节点的规律排列,可以用作搜索,结构如下图所示

二叉树虽然可以用于查找,但在某种特定情况下查找效率并不高,类似于下图:

2、红黑树对于二叉树的缺点,红黑树是一种拥有自平衡属性的二叉树,红黑树有五个特性:每个结点是黑色或者红色。

根结点是黑色。

每个叶子结点(NIL)是黑色。 [注意:这里叶子结点,是指为空(NIL或NULL)的叶子结点!不是有值的最后一个节点。]

不能有两个相连的红色节点。

每个结点到叶子结点NIL所经过的黑色结点的个数一样的。

根据以上五种属性,红黑树生成时采用左旋,右旋,左右旋,右坐旋等才做,会生成出一颗相对平衡的二叉树,如下图

3、Hash表Hash表类似于java中的hashMap,把索引列做hash映射后以KV结构存储在内存中,是精准查找最快的索引结构,只需要一次hash便可以定位,但不支持范围查找。

就是个K-V结构,不画图了

4、B-Tree由于数据库要存储大量的数据,如果采用二叉树进行查找,数据量过大时二叉树的层级过多,需要由上到下进行查找效率过慢,所以出现了B-Tree,BTree有如下特征

·叶节点具有相同的深度

·叶节点的指针为空

·所有索引元素不重复

·节点中的数据索引从左到右递增排列

数据结构直接上图

5、B+Tree不过mysql真正采用的不是BTree,Btree在做索引的时候有些地方并不是很实用,最终优化出了B+tree作为mysql innoDB存储类型的索引,B+tree的特征如下非叶子节点不存储data,只存储索引(冗余)

可以放更多的索引

叶子节点包含所有索引字段

叶子节点用指针连接,提高区间访问的性能

结构如下图

PS:innoDB中的主键索引的B+tree是聚集索引,叶子结点直接存储的其他字段的值,用于减少IO的次数,而辅助索引的叶子结点则是存储的主键的值,用于辅助查找

mysql主要索引类型

1:MyISAM存储引擎索引实MyISAM的索引和数据文件是分开的(非聚集索引),索引的叶子节点存储的是数据的物理地址,查找到相关索引后再用索引去硬盘上查找数据

2:InnoDB存储引擎索引实现InnoDB的索引是和数据存储在一起的(聚集索引),叶子结点中存储了所有其他字段的值,只需要一次加载叶子结点的IO进行索引匹配,匹配成功后不需要再次进行IO操作读取对应的数据

--表数据文件本身就是按B+Tree组织的一个索引结构文件

--非主键索引结构叶子节点存储主键值的原因是为了一致性和节省存储空间

3: 联合索引的底层存储结构联合索引是根据索引建立时字段的排列顺序建立的索引,后续索引是对第一个字段索引的再划分,差找时如果不能保证按照索引简历时的顺序进行查询,则联合索引失效

mysql 查找多组数据结构_MySql主要索引数据结构相关推荐

  1. MySQL 性能调优专题一(索引数据结构详解)

    索引的本质 索引是帮助MySQL 高效获取数据的排好序的数据结构. MySQL 默认使用的是B+Tree数据结构. 磁盘的读取原理 在介绍结构之前,先简单说下磁盘的读取原理: 操作系统读写磁盘的基本单 ...

  2. mysql like 多个条件_MySQL高性能索引策略

    索引类型 从物理存储角度: 聚集索引 InnoDB 叶节点包含了完整的数据记录.这种索引叫做聚集索引.因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有 ...

  3. mysql数据结构_mysql的底层数据结构

    一.数据结构 1. 二叉树 特点:左侧子节点比父节点小,右侧子节点比父节点大(对于同一个父节点下的两个子节点) 缺点:对于一直递增得数据不能存在该数据结构中,会变成链表,不能降低树的高度 图 1-1 ...

  4. mysql 查找差值最小_mysql获取两个表中日期字段的最小差值

    一.前言 开发中碰到的需求,获取两个数据表中日期字段的差值,并且取得差值最小的那条数据.本篇文章主要讲述如果通过函数获取mysql的日期差值,实际编写时遇到的问题,并且分析需求,得出最终sql等. 二 ...

  5. mysql查找字符串最后位置_mysql查找字符串出现位置

    标签: MySQL中的LOCATE和POSITION函数使用方法 FIND_IN_SET(str,strlist) 假如字符串str 在由N 子链组成的字符串列表strlist 中,则返回值的范围在 ...

  6. mysql组合索最左_MySQL组合索引和最左匹配原则

    可以看到该查询使用到了索引 EXPLAIN SELECT * FROM student WHERE id = 2 AND name = 'defghijk' and age = 8; 可以看到该查询使 ...

  7. mysql延迟关联为什么快_MySQL 覆盖索引与延迟关联详解

    本期来谈谈覆盖索引与延迟关联.在此之前,我们先简单建立一个订单表 Orders 用于举例说明.表中共包含 3 个字段: id int product_id name CREATE TABLE `ord ...

  8. mysql引用表无效列_Mysql使用索引可能失效的场景

    1.WHERE字句的查询条件里有不等于号(WHERE column!=-),MYSQL将无法使用索引 2.类似地,如果WHERE字句的查询条件里使用了函数(如:WHERE DAY(column)=-) ...

  9. mysql查找语句报错_MYSQL报错注入-WEB资讯专栏-DMOZ中文网站分类目录-免费收录各类优秀网站的中文网站目录....

    目录 审计思路报错语句报错函数查询表floor报错函数讲解报错原理语句xpath语法报错函数讲解语句整数溢出报错exppowcot列名重复报错name_constjoin using几何函数报错不存在 ...

最新文章

  1. 5分钟搞懂如何使用探针检查Kubernetes健康
  2. nodejs中的fiber(纤程)库详解
  3. 从权限管理看互联网产品的盈利方式
  4. Nacos配置中心-多配置文件加载
  5. Java 泛形通配符 ?
  6. 单一窗口关区备案_深圳跨境电商企业进出口备案,赶紧码下学习
  7. WEB安全基础-XSS基础
  8. python dataframe索引转成列_如何将 Pandas DataFrame 的索引转换为列
  9. JS 判断一个字符串是否包含在一个数组中
  10. 吴恩达深度学习之四《卷积神经网络》学习笔记
  11. mysqli得到记录数量
  12. linux内核移植imx8,NXP iMX8 Ubuntu 系统移植及 ROS 应用
  13. macOS 输入法快速切换工具 —— KeyboardHolder
  14. 64qam调制解调MATLAB,16QAM调制解调技术分析与MATLAB仿真
  15. CAD如何一键解决批量打印
  16. 玩转easyARM imax283A开发版(二),移植NES模拟器并增加按键驱动,让板子可以玩超级玛丽游戏
  17. 汉洛塔hanoi递归问题
  18. js实现拼接一个以逗号隔开的字符串
  19. 小孔成像总结_初中物理150条知识点总结,非常珍贵!
  20. Linux 命令详解之df命令

热门文章

  1. 远程办公一晃一天,环境搭建履步维艰
  2. 众说纷“云”,看生态驱动工业物联网落地
  3. 如何在 FPGA 上实现双线性插值的计算?
  4. 第二届字节跳动夏令营启动全球报名,图灵奖得主授课
  5. AI 应届博士生年薪八十万,贵吗?
  6. 一文了解电竞游戏平台的大数据玩法儿!
  7. day10【过渡】分布式理论
  8. linux查看内核分区,如何根据bootloader中MTD分区信息修改linux内核中的MTD分区
  9. mybatis redis_SpringBoot + Mybatis + Shiro + mysql + redis智能平台源码分享
  10. 学术诚信的重要性_关于学术诚信