慢查询解决:使用索引 
索引是帮助Mysql高效获取数据的排好序的数据结构
常见的存储数据结构:

二叉树

   二叉树不适合单边增长的数据

红黑树(又称二叉平衡树)

   红黑树会自动平衡父节点两边的节点数

B+树

   Mysql底层用的是B+树
   非叶子节点不存储data(data在Mysql中有可能是查询目标行的所有数据),
只存储索引(冗余),可以存放更多索引,减少io次数。
   叶子节点包含所有索引字段
   叶子节点用指针连接,提高区间访问的性能。
    B+树一个节点16kb,存储一个索引需要14字节 ,故一个节点可存储1170个索引,加入子节点的存储的data加上索引的大小为1kb那么一个h为n的树科存储的数据量为1170的n次方*16,只需要高为3的树既可以存储千万级的数据量,这也是为什么mysql使用B+树作为底层数据结构实现。
在mysql中的B+树实现,在子节点子之间添加了双向指针,相当于一个双向链表,这样在进行范围查询的时候查询目标值只需要沿着指针想目标方向遍历就可以获得所有所需数据,效率极高

Hash表

hash表结构,通过hash散列算法实现,当传入一个key,通过进行hash计算获得的值,可以直接定位到指向目标的指针,并且hash结构的查询速度和数据量并非是成正比,即便是极大的数据量,hash表也可以以较快的速度获取结果,但是缺点是不支持模糊查询、范围查询这类查询方式,所以mysql百分之99的表使用B+树结构


关于mysql引擎,并非是所有mysql表都是innodb,mysql中每个表都可以单独设置数据库引擎的。比较常见的就是innodb和Myisam了
Innodb特点(聚集的):
    mysql数据库中新建一个Innodb存储引擎的表,会生成2个数据文件这分别存储:
    .frm存储表结构
    .ibd存储索引字段和所有数据行
    表数据文件本身就是按B+Tree组织的一个索引结构文件
    聚集索引-叶节点包含了完整的数据记录
    为什么innodb表必须有主键,并且推荐使用整型的自增主键?
    答:由于innodb表数据本身就是B+组织的,所以如果不使用主键,也就没有索引,表结构无法建立,如果你不去指定主键,那么myql会隐性的建立一个rowid的字段作为主键。
    因为在mysql在建立B+树的时候牵涉到大量的大小比较,如果使用UUID这种字符串类型作为主键创建索引,明显比使用整型主键作为索引要慢的多,在之后的查询中也会慢很多,并且UUID占据的存储空间也会很大。因为每个叶子节点的大小是固定,使用的主键是非递增的,当插入一个处于中间的数值是会导致已经满了的节点需要再次分裂,b+树有可能需要再次进行平衡,会占用很多时间,而使用递增主键,那么就只需要不断的在末尾子节点后面增加节点即可,减去了很多的分裂平衡的过程以及比较大小找寻插入点的时间。
    为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)
    答:是为了方便于保证一致性和节省存储空间。
            如果在非主键索引的叶子节点也存储整行数据,这样的话在insert一个数据时就需要保证两个树结构维护完成之后才允许下面的操作,会导致在保证一致性的问题上有些复杂,并且会降低性能,还会造成数据冗余浪费存储空间。所以综合考虑之后,只在非主键索引结构中存储主键值,在通过非主键索引查询时只需要找到对应索引的主键值,在去主键索引中寻找数据即可。虽然在时间上会相比较主键索引直接查询低一些,但是避免了一致性问题和节省了存储空间。
MyIsam特点:   
MyISAM索引文件和数据文件是分离的(非聚集的)

mysql数据库中新建一个MyISAM存储引擎的表,会生成3个数据文件这分别存储:
.frm存储表结构
.MYD存储表所有的数据行
.MYI存储存储索引字段

聚集索引和非聚集索引

 聚集索引(聚簇索引)就是索引和数据存储在一个文件中,innodb使用的就是聚集索引
非聚集索引(稀疏索引)就是索引和数据存储在不同文件中,myisam使用的就是非聚集索引

联合索引的底层存储结构

联合索引的底层存储结构依旧是B+树。
加入有3个字段建立联合索引,那么索引中存储的就是三个字段连接在一起的数据。
那么联合索引如何去比较大小来保证一次递增的特性呢?
通过将3个字段逐个去对比,对比的次序依赖于字段在表中的顺序。

补充

1.关于mysql中索引树对于null值的处理

在mysql索引中,对于null值排序,如果是单值索引并且还是Null值,不会将null值放在非叶子节点,一般会放到叶子节点块的最前面。
对于联合索引,假如1、3索引有值,2为null值,会将2为null值的索引放在索引块的最前面,相当于当作最小值处理

附件列表

Mysql索引数据结构详解(1)的更多相关文章

  1. 图灵学院Java架构师-VIP-【性能调优-Mysql索引数据结构详解与索引优化】

    最近报名了图灵学院的架构专题的付费课程,没有赶上6月份开课,中途加入的.错过了多线程的直播课程,只能看录播了

  2. MySQL索引优化详解

    MySQL存储引擎简介 查看命令 a. 查看所使用的MySQL现在已提供什么存储引擎: mysql> show engines; b. 查看所使用的MySQL当前默认的存储引擎: mysql&g ...

  3. 二十三、mysql索引管理详解

    一.索引分类 分为聚集索引和非聚集索引. 聚集索引 每个表有且一定会有一个聚集索引,整个表的数据存储在聚集索引中,mysql索引是采用B+树结构保存在文件中,叶子节点存储主键的值以及对应记录的数据,非 ...

  4. 二十二、mysql索引原理详解

    背景 使用mysql最多的就是查询,我们迫切的希望mysql能查询的更快一些,我们经常用到的查询有: 按照id查询唯一一条记录 按照某些个字段查询对应的记录 查找某个范围的所有记录(between a ...

  5. MySQL索引机制详解(B+树)

    一.索引是什么? 索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构. 二.为什么要使用索引? 索引能极大的减少存储引擎需要扫描的数据量. 索引可以把随机IO变成顺序IO. 索引可以帮助我 ...

  6. MySQL索引操作命令详解

    创建索引: MySql创建索引的语法如下: CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type] ON table_ ...

  7. 如何查看mysql数据库的引擎/MySQL数据库引擎详解

    一般情况下,mysql会默认提供多种存储引擎,你可以通过下面的查看: 看你的mysql现在已提供什么存储引擎:mysql> show engines; 看你的mysql当前默认的存储引擎:mys ...

  8. 0614MySQL的InnoDB索引原理详解

    转自http://www.cnblogs.com/shijingxiang/articles/4743324.html MySQL的InnoDB索引原理详解 http://www.admin10000 ...

  9. 5种Redis数据结构详解

    本文主要和大家分享 5种Redis数据结构详解,希望文中的案例和代码,能帮助到大家. 转载链接:https://www.php.cn/php-weizijiaocheng-388126.html 2. ...

随机推荐

  1. linux hostid与lmhostid

    https://wangchujiang.com/linux-command/c/hostid.html hostid(host identifier) 显示当前主机的十六进制数字标识. 概要 hos ...

  2. ASP的调试技术解答

    一. 调试 ASP.NET 应用程序时出现"未将项目配置为进行调试"的错误信息 症状 当您在 Visual Studio .NET 中调试 ASP.NET 应用程序时,可能会出现下 ...

  3. 0x02

    #include<bits/stdc++.h> using namespace std; int n,a[10][10],vis[10],ans,b[10][10]; inline int ...

  4. 解决CentOS添加新网卡后找不到网卡配置文件,配置多网卡并设置静态路由

    参考文章 https://blog.csdn.net/qq_36512792/article/details/79787649 使用VMware Workstation虚拟机安装好CentOS7虚拟机 ...

  5. Socket `accept queue is full ` 但是一个连接需要从SYN->ACCEPT

    由于标题长度有限制,我把想要描述的问题再次描述下: 内核通常会为每一个LISTEN状态的Socket维护两个队列: 1 accept队列: listen()函数第二个参数BACKLOG指定,表示已完成 ...

  6. 设计模式学习-使用go实现代理模式

    代理模式 定义 优点 缺点 应用场景 代码实现 参考 代理模式 定义 定义:为其对象提供一种代理以控制这个对象的访问.通俗点讲就是它在不改变原始类(或叫被代理类)代码的情况下,通过引入代理类来给原始类 ...

  7. @RestController注解的作用

    原文出自"https://www.cnblogs.com/yaqee/p/11256047.html" 一.在Spring中@RestController的作用等同于@Contro ...

  8. Python基础(迭代)

    # from collections import Iterable#collections模块的Iterable类型判断 # dict1 = {'a':111,'b':222,'c':333} # ...

  9. 带allow-create的el-select限制长度

    需求:给el-select添加新增字段长度限制且新增内容不能为空 1.首先给el-select绑定一个id(例如:selectSku),这个id会传到组件里面,绑定在那个input上面, <el ...

  10. final关键字、抽象类、抽象类和接口的区别

    1.final关键字 1.1.final修饰的类无法继承. 1.2.final修饰的方法无法覆盖. 1.3.final修饰的变量只能赋一次值. 1.4.final修饰的引用一旦指向某个对象,则不能再重 ...