慢查询解决:使用索引 
索引是帮助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安装部署Zabbix

    Zabbix 是一个企业级的分布式开源监控方案,能够监控各种网络参数以及服务器健康性和完整性的软件.Zabbix使用灵活的通知机制,允许用户为几乎任何事件配置基于邮件的告警.这样可以快速反馈服务器的问 ...

  2. 新手使用python以及pycharm看过来

    前言 随着互联网时代的进步,人类与计算机之前的沟通交流越来越便捷,自此交流的媒介--编程语言吸引力更多的人学习,今天我们就来谈谈当前市面上最火的编程语言 1.文件的概念 什么是文件夹.文件 其实是操作 ...

  3. 设计模式学习-使用go实现原型模式

    原型模式 定义 代码实现 优点 缺点 适用场景 参考 原型模式 定义 如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复 ...

  4. DDL数据定义语言

    DDL数据定义语言 (一)概述 DDL(Data Definition Language):数据定义语言,用来定义数据库对象,库.表.列等:创建.删除.修改 库,表结构.主要分为操作数据库的DDL和操 ...

  5. css 马赛克悬停效果

    css 马赛克悬停效果 <!DOCTYPE html> <html lang="en"> <head> <meta charset=

  6. Linux mem 2.5 Buddy 内存回收机制

    文章目录 1. 简介 2. LRU 组织 2.1 LRU 链表 2.2 LRU Cache 2.3 LRU 移动操作 2.3.1 page 加入 LRU 2.3.2 其他 LRU 移动操作 3. LR ...

  7. idea离线安装lombok插件

    1.查看自己idea版本,2019.1.2,必须安装相同版本的插件 2.从http://plugins.jetbrains.com/plugin/6317-lombok-plugin中下载对应版本的l ...

  8. sqlalchemy flush commit

    https://segmentfault.com/q/1010000000698181 flush 将sql发送到内存 commit 真正提交

  9. IntelliJ IDEA 的 Bean validation 里有什么用

    IntelliJ IDEA  的 Bean validation 是指右侧的框. 平时都是缩起来的,今天心血来潮.研究下这个是干嘛的?怎么用. 三个按钮全按下的话,下面的项目就会有三个菜单可选项. C ...

  10. FZU ICPC 2020 寒假训练 3

    P1308 统计单词数 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数.现在,请你编程实现这一功能,具体要求是:给定一 ...