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

索引的数据结构

1.hash表

a.利用hash存储的话需要将所有的数据文件添加到内存,比较耗费内存空间

b.hash表存储的是无序数据,范围查找的时候需要挨个进行遍历,比较耗费时间。

2.二叉树

二叉树规定左子树必须小于根节点,右子树必须大于根节点,可能会导致右子树变成一条链表,对提升查询效率没有帮助。

3.平衡树(AVL树)

AVL树是一颗严格意义上的平衡树,它要求最高子树和最低子树的高度之差不超过1,因此在进行元素插入的时候,会进行1到n次的旋转,严重影响插入的效率。

4.红黑树

红黑树是基于AVL树的一个升级,损失了部分查询的性能,来提升插入的性能,在红黑树中,最高子树不能超过最低子树的2倍,在插入的时候,不需要进行N多次的旋转操作,而且加入了变色的特性,来满足插入和查询性能的平衡。ps:二叉树及其变种的其他树都不能支撑索引的需求,原因是其插入数据的性能比较低,并且树的深度无法控制,都会因为树的深度过深而造成io的次数变多,影响读取数据的效率。

5.B-Tree

B树的特点:

1.所有键值分布在整颗树上

2.搜索可能在非叶子节点上结束,在关键字全集内做一次查找,性能逼近二分查找

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

缺点:每个节点同时包含了key和data,而每个页存储空间是有限的,

如果data比较大的话会导致每个节点存储的元素数量变小。

当存储量变大时,会导致深度变大,增大磁盘io次数,进而影响查询性能。

6.B+Tree

B+Tree是在B-Tree的基础之上做的一种优化:

1.B+Tree的非叶子节点只存储索引,不存储data,使非叶子节点可以包含更多的节点,这样有两个好处,一是大大降低了树的高度,二是将数据范围变成多个区间,增加了检索的效率。

2.叶子节点存储所有的索引和data,而且所有的叶子节点相互连接,形成了一种链式结构,范围查询性能更高。ps:索引的从磁盘到内存的load过程中会产生磁盘I/O消耗,相对于内存读取,I/O存取的消耗要高好几个数量级,所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数。换句话说,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数。B+Tree这种数据结构利用了磁盘预读原理,将每个节点的大小设为等于一个页,每个节点只需要一次I/O就可以载入,并且节点中的数据和索引从左到右递增排列,符合局部性原理,所以B+Tree拥有更好的性能。

InnoDB索引实现

聚簇索引

在InnoDB这种存储引擎下,数据和索引是放在一起的.frm存放的是表结构.ibd存放表数据和索引

ps:innoDB存储引擎默认情况下会把所有的数据文件放到表空间中,不会单独为每一张表保存一份数据文件,如果需要将每一张表单独使用文件保存,设置如下属性:set gobal innodb_file_per_table=on

InnoDB--B+Tree

1.叶子节点直接存放索引和数据

2.InnoDB中至少有一个聚簇索引,一般会通过B+Tree对主键创建索引,如果没有主键,会选择唯一键,如果没有唯一键,会自动生成一个6位rowid来作为主键

3.在非聚簇索引中,叶子节点上存储的是该行数据的主键,然后通过聚簇索引找到对应的数据,也就是要走两次B+Tree,叫做回表

MyISAM索引实现

非聚簇索引

在MyISAM这种存储引擎下,数据和索引文件是单独的文件.frm存放的是表结构.MYI存放索引.MYD存放表数据

MyISAM--B+Tree

1.叶子节点存放索引和对应数据的磁盘文件地址

2.MyISAM不存在回表的问题

数据结构行编辑成簇 c语言,索引的数据结构及底层存储相关推荐

  1. 简单行编辑程序设计文档(数据结构)课设

    数据结构课设 摘要 1 绪论 1.1 设计任务 1.2 设计思想 1.3 基础知识 1.3.1栈的概念和特性 1.3.2栈的存储结构 1.3.3对栈的几种运算的实现方法 2 相关数据类型的类C语言定义 ...

  2. 基础数据结构-堆栈-拓展:行编辑

    使用C++的STL堆栈对象,编写程序实现行编辑功能.行编辑功能是:当输入#字符,则执行退格操作:如果无字符可退就不操作,不会报错 本程序默认不会显示#字符,所以连续输入多个#表示连续执行多次退格操作 ...

  3. 数据结构源码笔记(C语言):索引文件建立和查找

    //实现索引文件建立和查找算法#include<stdio.h> #include<malloc.h> #include<string.h> #include< ...

  4. 索引的数据结构--MySQL

    [https://www.bilibili.com/video/BV1iq4y1u7vj] 个人根据 尚硅谷宋红康Mysql高级视频总结的学习笔记 1.为什么使用索引 索引是存储引擎用于快速找到数据记 ...

  5. MySQL - 索引的数据结构

    目录 一.为什么使用索引 二.索引及其优缺点 1.索引概述 2.优点 3.缺点 三.InnoDB中索引的推演 1.索引之前的查找 在单页中查找 在多页中查找 2.设计索引 一个简单的索引设计方案 In ...

  6. MySQL高级篇知识点——索引的数据结构

    目录 1.为什么使用索引 2.索引及其优缺点 2.1.索引概述 2.2.优点 2.3.缺点 3.InnoDB 中索引的推演 3.1.索引之前的查找 3.1.1.在一个页中的查找 3.1.2.在很多页中 ...

  7. 【MySQL高级篇】第06章_索引的数据结构

    第06章_索引的数据结构 1. 为什么使用索引 索引是存储引擎用于快速找到数据记录的一种数据结构,就好比一本教科书的目录部分,通过目录中找到对应文章的页码,便可快速定位到需要的文章.MySQL中也是一 ...

  8. 数据结构源码笔记(C语言):B树的相关运算算法

    //B树的相关运算算法#include<stdio.h> #include<malloc.h>#define MAXM 10//定义B树最大的阶数 typedef int Ke ...

  9. 23V3有这种C语言表达式吗,数据结构(C语言版第2版_李云清)习题答案2012-12.doc

    数据结构(C语言版第2版_李云清)习题答案2012-12.doc 第 1 章 绪论 1.1 什么是数据结构? [答]:数据结构是指按一定的逻辑结构组成的一批数据,使用某种存储结构将这批数据存储 于计算 ...

最新文章

  1. linux cat 查看文件内容 不带#号的,Linux下如何不用cat命令读取文件内容
  2. mysql数据库初识实训总结_MySQL数据库初识(基础语句)
  3. 克服过拟合和提高泛化能力的20条技巧和诀窍
  4. yii 字段验证的使用
  5. 序列化的作用_Java 序列化的高级认识
  6. [学习之道] 修福不修慧,大象披璎珞; 修慧不修福,罗汉托空钵 (学习写程序,只靠补习上课吗?)...
  7. 高频交易主要模式解析
  8. java/php/net/pythont物流配送中心管理系统设计
  9. 【Scratch案例实操】scratch我们爱编程 scratch编程案例教学 scratch创意编程 少儿编程教案
  10. Netty + JavaFx 实战:仿桌面版微信聊天
  11. Crash自动修复系统
  12. Markdown|书单
  13. 中山大学计算机学院交换生去国外,中山大学取消与伯克利大学交换生项目
  14. EEPROM介绍及与Flash区别
  15. selenium 火狐下载弹框去除
  16. 事理图谱,下一代知识图谱
  17. VLC播放gstreamer pipeline rtp流
  18. java多线程编程学习路线
  19. 爱思服务器shsh文件类型,使用爱思助手备份/上传SHSH
  20. 屏蔽在线视频广告的方法

热门文章

  1. VUE2.x的浏览器兼容情况汇总
  2. 更新node最新版本方法和 npm install -g n 运行错误
  3. OC-@dynamic 关键字
  4. WordPress分类列表函数:wp_list_categories用法及参数详解举例
  5. 史上最全亚历山大大帝名言
  6. 项目中的那些事---下载pdf文件
  7. android 入门-android自定义控件
  8. 企业级应用框架(五)IOC容器在框架中的应用
  9. 报错:不是可以识别的内置函数名称
  10. HierarchicalBeanFactory接口