慢查询解决:使用索引 
索引是帮助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. HttpContext.Current.Request.Url 地址:获取域名

    假设当前页完整地址是:http://www.test.com/aaa/bbb.aspx?id=5&name=kelli 协议名----http://域名  ---- www.test.com站 ...

  2. undefined reference to `recvIpcMsg(int, ipc_msg*)'——#ifdef __cplusplus extern "C" { #endif

    最近在弄一个进程间通信,原始测试demon用c语言写的,经过测试ok,然后把接口封装起来了一个send,一个recv. 使用的时候send端是在一个c语言写的http服务端使用,编译ok没有报错,但是 ...

  3. 【Go语言学习笔记】为什么要选择Go语言

    一门语言的兴起一定有他的原因,所谓天下苦Java久矣,Go的到来可以说很多后端开发的福音,尤其是在微服务.分布式这么火的今天,那么,他的优势到底是什么呢? 首先,我们需要现有后端语言的优势痛点: 其实 ...

  4. supervisor安装

    supervisor管理进程,是通过fork/exec的方式将这些被管理的进程当作supervisor的子进程来启动,所以我们只需要将要管理进程的可执行文件的路径添加到supervisor的配置文件中 ...

  5. namespace之cgroup

    Linux Namespace,但是Namespace解决的问题主要是环境隔离的问题,这只是虚拟化中最最基础的一步,我们还需要解决对计算机资源使用上的隔离.也就是说,虽然你通过Namespace把我J ...

  6. redis 内存划分

    1.数据:作为数据库,数据是最主要的部分,这部分占用的内存会被统计在used_memory中 2.进程内存:redis主进程本身运行需要占用的内存,这部分内存会被统计在used_memory_rss中 ...

  7. [nowcoder5668H]Sort the Strings Revision

    考虑对于$p_{i}=0$,那么可以快速比较出$s_{0},s_{1},...,s_{i-1}$与$s_{i},s_{i+1},...,s_{n}$之间的大小关系,然后对两边分别找到最小的$p_{i} ...

  8. Electron快速入门之debug

    view->toggleDevelpper Tools 本地桌面调试 浏览器debug "start": "electron --inspect=5858 .&qu ...

  9. 洛谷 P6189 - [NOI Online #1 入门组]跑步(根号分治+背包)

    题面传送门 题意: 求有多少个数列 \(x\) 满足: \(\sum x_i=n\) \(x_i\geq x_{i+1}\) 答案对 \(p\) 取模. ...你确定这叫"入门"组 ...

  10. Atcoder Grand Contest 005 E - Sugigma: The Showdown(思维题)

    洛谷题面传送门 & Atcoder 题面传送门 记先手移动棋子的树为红树,后手移动棋子的树为蓝树. 首先考虑一个性质,就是如果与当前红色棋子所在的点相连的边中存在一条边,满足这条边的两个端点在 ...