慢查询解决:使用索引 
索引是帮助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. Spring---IoC(控制反转)原理学习笔记【全】

    1.IoC创建对象的方式 使用无参构造创建对象 假如要使用有参构造创建: 下标赋值constructor-arg <!--有参--> <bean id="User" ...

  2. 整数转化 牛客网 程序员面试金典 C++ Python

    整数转化 牛客网 程序员面试金典 C++ Python 题目描述 编写一个函数,确定需要改变几个位,才能将整数A转变成整数B. 给定两个整数int A,int B.请返回需要改变的数位个数. 测试样例 ...

  3. 第02课 OpenGL 多边形

    你的第一个多边形: 在第一个教程的基础上,我们添加了一个三角形和一个四边形.也许你认为这很简单,但你已经迈出了一大步,要知道任何在OpenGL中绘制的模型都会被分解为这两种简单的图形.读完了这一课,你 ...

  4. oracle 归档日志:db_recovery_file_dest、log_archive_dest和log_archive_dest_n的区别和使用

    概念: db_recovery_file_dest:默认的指定闪回恢复区路径 log_archive_dest:指定归档文件存放的路径,所有归档路径必须是本地的,默认为''.log_archive_d ...

  5. Python小练习之验证“哥德巴赫猜想”

    设计内容:任何一个大于2的偶数都可以分解为两个素数之和,这就是著名的哥达巴赫猜想. 设计要求:要求输入一个大于2的偶数,程序运行后,输出两个素数,其和正好等于该偶数. 1.    实验代码(知道是你们 ...

  6. MySQL:由于找不到VCRUNTIME140_1.dll,无法继续执行代码。重新安装程序可能会解决此问题

    我只是搬用工,记录一下 方法一: 安装这个微软常用运行库合集(https://www.repaik.com/), 链接:https://pan.baidu.com/s/1r4JJaUKjw-y1g3l ...

  7. 《手把手教你》系列技巧篇(四十)-java+ selenium自动化测试-JavaScript的调用执行-下篇(详解教程)

    1.简介 在实际工作中,我们需要对处理的元素进行高亮显示,或者有时候为了看清楚做跟踪鼠标点击了哪些元素需要标记出来.今天宏哥就在这里把这种测试场景讲解和分享一下. 2.用法 创建一个执行 JS 的对象 ...

  8. 基于霸道秉火的STM32F103ZET6嵌入式开发之------基于定时TIM3的PWM实验

    1:PWM脉冲宽度调制 STM32 的定时器除了 TIM6 和 7.其他的定时器都可以用来产生 PWM 输出.其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出.而通用定 ...

  9. Ubuntu系统下《汇编语言》环境配置

    说明 1.系统:Ubuntu codists@pc:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Des ...

  10. scrapy的安装,scrapy创建项目

    简要: scrapy的安装 # 1)pip install scrapy -i https://pypi.douban.com/simple(国内源) 一步到位 # 2) 报错1: building ...