索引的定义:索引(Index)是帮助MySQL高效获取数据的数据结构。

Q1:大家使用索引有没有想过这个问题?为什么索引能够帮助mysql高效获取数据?我一一给大家道来!在给大家讲之前,先更大家分享一些计算机基础知识,有助于理解

A:1:MySQL的数据都是以文件的形势存储在磁盘上的。

2:磁盘是由一圈一圈的磁道组成。

3:磁头移动到不同的磁道,磁盘旋转,这样就可以读到数据。

4:磁盘存取原理 1.寻道时间(速度慢,费时)  2.旋转时间(速度较快)

5:CPU读取数据都是从内存读取,内存去磁盘中读取数据,内存读取磁盘数据大小都是以页的大小单位。一页 = 10kb

总结:1:当磁头移动到另一个磁道读取数据就是我们常说的一次I/O操作,MySQL数据是分布在不同的磁道上的,每次读取数据都要把所有的磁道读取一遍。

那我们进行I/O操作的次数就很多了,查询效率就很低。

2:索引就是把索引字段数据的地址保存起来,来帮助MySQL直接定位到哪个磁道哪个扇区,这样就减少了I/O的操作次数了,自然查询效率就提高了。

Q2:数据结构那么多,mysql索引为什么要用B+Tree数据结构,而不是其他呢?肯定其他的数据不满足我们的要求

常见的数据结构:

1:二叉树

2:红黑树

3:hash

4: B  Tree

5: B+Tree

a.二叉树

二叉树是n(n>=0)节点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根节点和二棵不想交的,分别称为根节点的左子树和右子树组成。

不使用原因:一个节点只有一度,就是只有一个子节点,那读取树的一层就是一次I/O操作,性能也不好。

b.红黑树

红黑树即为平衡二叉树的一种

不使用原因:一个节点有二个子节点,那就出现一层只有二个节点的情况,这种性能也不好

c.hash

不使用原因:Hash是把索引数据进行Hash算法对应一个地址,我们会发现这个性能很好啊,直接找到但是我们想想,他能满足我们日常大部分情况么?

比如通过大于或小于筛选数据,所以说也不合适,当然MySQL也提供了Hash索引,毕竟有些场合用起来还是不错的

d.B Tree

1.度(Degree)-节点的数据储存个数  2.叶节点具有相同的深度  3.叶节点的指针为空  4.节点中的数据key从左到右递增排列

不使用原因:虽然解决了每一层的节点数的极端情况下,但是每一个节点存储了索引和数据,一层存储的数据太多也不好,毕竟内存能读取的数据大小就10kb.

e.B+Tree

1.B+Tree(B-Tree的变种)  2.非叶子节点不存储data,只存储key,可以增大度  3.叶子节点不存储指针  4.顺序访问指针,提高区间访问性能

使用原因:设计有几个方面

1:非叶子节点不存储data,只存储key,可以增大度

2:叶子节点不存储指针

3:顺序访问指针,提高区间访问的性能。

三:B+Tree索引的性能分析

.一般使用磁盘I/O次数评价索引结构的优劣。

..预读:磁盘一般会顺序向后读取一定长度的数据(页的整倍数)放入内存

..局部性原理:当一个数据被用到时,其附近的数据也通常会马上被使用

....B+Tree节点的大小设为等于一个页,每次新建节点直接申请一个页的空间,这样保证一个节点物理上也存储在一个页里,就实现了一个节点的载入只需要一次I/O

.....B+Tree的度d一般会超过100个,因此h非常小(一般为3到5之间)

四:不同的存储引擎,有不同的索引实现

1:MyISAM索引实现(非聚集)   2.InnoDB索引实现(聚集)

a.MyISAM索引实现(非聚集)

---->MyISAM索引文件与数据文件是分离的

b.InnoDB索引实现(聚集)

1:数据文件本身就是索引文件  2:表数据文件本身就是按B+Tree组织的一个索引结构文件  3:聚集索引-叶节点包含了完整的数据记录

4:为什么InnoDB表必须有主键,并且推荐使用整型的自增主键?  5:为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)

五:联合索引结构

--->联合索引的底层存储结构长什么样?

六:索引最左前缀原理

mysql索引数据结构图解_深入理解Mysql索引底层数据结构与算法相关推荐

  1. mysql索引数据结构图解_干货:mysql索引的数据结构

    索引 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构. 我们知道,数据库查询是数据库的最主要功能之一.我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计 ...

  2. mysql的原理图解_图文并茂讲解Mysql事务实现原理

    开篇 相信大家都用过事务以及了解他的特点,如原子性(Atomicity),一致性(Consistency),隔离型(Isolation)以及持久性(Durability)等.今天想跟大家一起研究下事务 ...

  3. mysql 联合主键_深入理解Mysql索引底层数据结构与算法,背后的故事

    引言 索引是帮助MySQL高效获取数据的排好序的数据结构 索引数据结构对比 二叉树 左边子节点的数据小于父节点数据,右边子节点的数据大于父节点数据.如果col2是索引,查找索引为89的行元素,那么只需 ...

  4. mysql mvcc实例讲解_轻松理解MYSQL MVCC 实现机制

    1. MVCC简介 1.1 什么是MVCC MVCC是一种多版本并发控制机制. 1.2 MVCC是为了解决什么问题? 大多数的MYSQL事务型存储引擎,如,InnoDB,Falcon以及PBXT都不使 ...

  5. mysql 交叉连接的用法_深入理解MySQL的外连接、内连接、交叉连接

    1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和 ...

  6. 3层b+树索引访问磁盘次数_深入理解MySQL索引底层实现原理丨技术干货

    一.索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干,就可以得到索引的本质:索引是数据结构. 我们知道,数据库查询是数据库的最主要功能之 ...

  7. 怎么运用索引查处mysql表中的数据_深入理解MySQL数据库索引原理及实现,快速检索数据库 MySQL数据库使用教程...

    免费学习推荐: 一.索引的概念 1.索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址 (类似于C语言的链表通过指针指向数据记录的内存地址) . 2.使用索引后可以不用 ...

  8. mysql导入dat文件_从零开始学习 MySQL 系列--索引、视图、导入和导出

    前言 上篇文章我们学习了数据库和数据表操作语句,今天我们学习下数据库索引,视图,导入和导出的知识. 作为基础篇,不会涉及到关于索引和视图的高级应用和核心概念,但是基本操作大家会了解,尤其是关于索引的内 ...

  9. Mysql 索引优化分析_如何优化MySQL的性能?从索引方面优化案例分析

    今天我们来讲讲如何优化MySQL的性能,主要从索引方面优化. 建表 //建表 CREATETABLEIFNOTEXISTSstaffs( idINTPRIMARYKEYAUTO_INCREMENT, ...

最新文章

  1. 前端交易型系统设计原则
  2. rocketmq 消息指定_详解RocketMQ不同类型的消费者
  3. [OS复习]虚拟存储管理技术 1
  4. Centos5.5安装使用Xen
  5. undefined reference to “boost” in Qt—Ubuntu
  6. 顺序表(代码、分析、汇编)
  7. django入门项目图书管理
  8. android monkey优化,GitHub - baozhida/AndroidMonkey: 这个项目是CrashMonkey4Android可执行文件,修复了一些bug,做了一些优化...
  9. 类、对象以及jvm运行内存解析
  10. 【Spring】SpringBoot 如何使用JMX
  11. 一张图了解Spring Cloud微服务架构
  12. OpenGL+VS2013环境配置
  13. 【C语言】冒泡排序与回文判断
  14. 详解java的构造方法
  15. oracle的启动与关闭原理-数据路的分阶段启动
  16. Java设计登录界面
  17. 艾宾浩斯记单词 记忆周期时间表
  18. EI会议列表--IEEE主办的会议
  19. 架构搜索文献笔记(5):《APQ:联合搜索网络结构、剪枝和量化策略》
  20. 用Python画笑脸

热门文章

  1. 1.1 计算机的发展
  2. MySQL中的用户管理
  3. Java集合HashSet
  4. android多屏幕适配资源生成,android – 多屏幕适配相关
  5. 快手二面:引入RabbitMQ后,你如何保证全链路数据100%不丢失?
  6. 你所需要的java基础篇和提升篇大总结
  7. Java改进的冒泡排序ImprovedBubbleSort
  8. Java监听器用法(三):外部类监听器
  9. Java IO流之对象流
  10. 【JavaSE05】Java中方法与重载、递归-思维导图