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

MySQL数据库索引存储结构一般有以下几种。

  • 二叉树
  • 红黑树
  • HASH
  • B-Tree
  • B+Tree(现在常用)

首先我们要了解的是:索引文件是存储在磁盘中的,cpu到磁盘拿取数据一般经过两步:寻道时间(磁头左右移动,速度慢,耗时)和旋转时间(磁盘旋转,快)。cpu获取数据后存入内存中的这一过程,被称为一次磁盘I/O。

接下来介绍一下几种索引结构的优缺点:

二叉树:

优点:查找减半
缺点:索引数据只能是无序的,有序数据用二叉树是个单链,完全无意义。

红黑树:

优点:相比二叉树好一点,有序数据也可以使用,当节点为3时,会自动分解平衡。
缺点:如果数据量很大,每次插入数据,它都会自动平衡,所以特别消耗性能,而且节点的高度是无法预测的,所以磁盘I/O操作也不可控。

HASH:

原理:存储结构是key-value形式存在数组中,然后通过hash函数(key)得到一个值,这个值就是它们的索引。当取数据的时候,key通过hash得到索引值,直接找就行了,复杂度为o(1)。

优点:查找速度快。
缺点:
1.会碰到key冲突情况。
2.HASH结构无序,多以当查找范围数据的话,就慢一点,对于不等值的查找,就更慢了(不能避免全表扫描)
3.无法通过索引值排序,因为索引存放的值是经过hash的,可能跟原来的值不相等

B-Tree:

优点:
1.一次可以设置多个节点,降低了树的高度,多以查找很快。
2.节点中的数据key从左到右依次递增。
缺点:
1.根节点不仅存了索引key也存了对应的记录,所以比较占用空间。
2.子节点之间没有双向链表,每次查找数据都是从根节点出发,如果是查找范围数据的话,就没有优势了。如下图:

B+Tree

优点:(与B-Tree区别)
1.索引携带的数据移到了叶子节点上,在空间相同的情况下,那肯定是B+Tree存储的索引更多一些,而且树的高度更低。
2.子节点之间是有双向指针指向的,查找的时候,顺着指针找就行了,不用每次都从根节点出发寻找,所以速度更快。如下图:

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

预读:处理读取索引外,磁盘一般都会顺序向后读取一定长度的数据放入内存中。

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

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

B+Tree 的节点非常多,一般都会超过100,所以高度很低,一般为3-5层

查看MySQL文件页的大小:SHOW CLOBAL STATUS like 'Innodb_page_size';

综上所述:索引结构选择B+Tree是完美的。或许以后还有更好的方式,有待挖掘!

独孤求败--之--MySQL索引存储结构(5种)相关推荐

  1. Mysql.索引存储结构演进(面试一次搞定)

    数据结构演进你能明白为啥要用B+Tree来存储,其中B树已经结合了部分磁盘读取的特性,现在详细讲解,在逻辑上存储数据和在磁盘上存储树的区别, Mysql.索引数据结构演进_闲猫的博客-CSDN博客 如 ...

  2. MySQL索引失效的9种情况(针对InnoDB存储引擎)

    前言 MySQL中提高查询性能的最有效的方式之一就是对数据表合理的设计索引,优秀的索引的设计方案很大程度上可以提高查询的性能. 因此,索引对查询的速度有着至关重要的影响. 为了尽量的使优化器用到我们的 ...

  3. SQL Server 表和索引存储结构

    SQL Server 表和索引存储结构 杜飞 在上一篇文章中,我们介绍了SQL Server数据文件的页面类型,系统通过96个字节的头部信息和系统表从逻辑层面上将表的存储结构管理起来,具体到表的存储结 ...

  4. sql server 索引阐述系列二 索引存储结构

    "流光容易把人抛,红了樱桃,绿了芭蕉" 转眼又年中了,感叹生命的有限,知识的无限.在后续讨论索引之前,先来了解下索引和表数据的内部结构,这一节将介绍页的存储,页分配单元类型,区的存 ...

  5. MySQL 索引失效的 15 种场景!

    背景 无论你是技术大佬,还是刚入行的小白,时不时都会踩到Mysql数据库不走索引的坑.常见的现象就是:明明在字段上添加了索引,但却并未生效. 前些天就遇到一个稍微特殊的场景,同一条SQL语句,在某些参 ...

  6. Mysql索引有哪几种类型

    索引是一种将数据库中单列或者多列的值进行排序的结构.应用索引可以大幅度提高查询的速度. 用户通过索引查询数据,不但可以提高查询速度,也可以降低服务器的负载.用户查询数据时,系统可以不必遍历表中的所有记 ...

  7. Mysql索引底层结构解析

    从一个实战案例了解索引 我们可以看到这有一个87万的表 没加索引之间执行 SELECT * from t_program WHERE code = '1a5712ef6a864ccca9313aeda ...

  8. mysql聚簇索引存储结构_Mysql聚簇索引和非聚簇索引原理(数据库)

    本文链接:https://blog.csdn.net/lisuyibmd/article/details/53004848 一.'页'和操作系统的关系 ①为什么要有内存管理? 我们知道,一个进程完成他 ...

  9. mysql标准化存储结构_Atitit.自定义存储引擎的接口设计 api 标准化 attilax 总结  mysql...

    Atitit.自定义存储引擎的接口设计api标准化attilax总结mysql 1.图16.1:MySQL体系结构 存储引擎负责管理数据存储,以及MySQL的索引管理.通过定义的API,MySQL服务 ...

  10. mysql聚簇索引存储结构_MySQL聚簇索引的实际应用于结构描述

    以下的文章主要介绍的是高性能的MySQL索引策略之MySQL聚簇索引(Clustered Indexes),我们大家都知道MySQL聚簇索引(Clustered Indexes),在实际应用中比例还是 ...

最新文章

  1. sangerbox平台使用(四)气泡图的绘制
  2. Objective-C中的常量
  3. python 画柱状图-python使用Plotly绘图工具绘制柱状图
  4. tableau可视化数据分析60讲(八)-tableau计算函数(重点知识)
  5. 嗯?那你来说说用 ArrayList 还是 LinkedList
  6. LeetCode 1392. 最长快乐前缀(KMP)
  7. keras安装_代码详解:构建一个简单的Keras+深度学习REST API
  8. 《自然》年度十大人物出炉!中国科学家入选
  9. 401 un[Authorize]
  10. 最近在做中文的全文检索(中文搜索引擎)
  11. 机器学习- 吴恩达Andrew Ng Week5 神经网络学习Neural Networks Learning知识总结
  12. 翻译:PropertyWrapper swift 5 aop特性
  13. Windows下CMake安装教程
  14. EtherCAT基于SOEM建立主站程序
  15. matlab log算子求取,数字图像处理---LOG算子和CANNY算子边缘提取(matlab)
  16. 从底层看android5.0系统的启动过程
  17. 题解第八届蓝桥杯B.等差素数列
  18. python分离gif_python 将GIF拆分成图片方法
  19. origin数据平滑_科学网—关于origin曲线平滑处理 lowess - 叶小球的博文
  20. SQL server 2000个人版 下载地址

热门文章

  1. 华为企业业务的数字化与绿色节能“双向突围”
  2. [02.20][中国][人再囧途之泰囧][HD-RMVB.720p.国语中字][2012年喜剧]
  3. TokenInsight 对话首席——2019年底层公链机会展望
  4. (ECPC 16) (6/11)
  5. 标准差SD、相对标准偏差RSD学习和python实现
  6. ftp 227 entering passive mode
  7. Linux系统编程学习笔记
  8. 全球及中国有机橘子油行业投资前景预测与重点企业经营分析报告2021-2027年版
  9. TalkingData的使用,iOS数据统计
  10. 一站式WPF--依赖属性(DependencyProperty)一