MySQL 底层数据结构 聚簇索引以及二级索引 Explain的使用

数据结构

我们知道MySQL的存储引擎Innodb默认底层是使用B+树的变种来存储数据的

下面我们来复习一下B树存储 + B树存储  + 哈希存储的区别

哈希存储,只能使用等值查询

B树与B+树存储

我们知道B+树实际上就是B树的变种

那么为啥使用B+树而不是使用B树呢?

我们知道效率的高低主要取决于load进内存的时候这个load操作的次数

注:数据表中的数据只是逻辑上连续的,在物理内存中其实是不连续的

因为我们知道磁盘是一圈一圈的,磁头是一直在读写的

可能两次读写之间根本不在一个磁道中

我们先看看B树的数据结构

假设这里我们向查找一个9号数据,我们内存中就会加载这里的根节点,以二分查找的方式开始查找9,但是这里的查找由于一层存放的节点是带有数据的,相对来说存放相同的数据的节点数就会少,对应的层数也就升高了,所以MySQL决定使用了B树的变种,B+树,B+树只在叶子结点存储数据,这样同一层能存储的数据就多了,虽然每一层都会使用一个冗余节点,但是内存开销也是很小的

一个叶节点最大16K(默认)

假设对于一个千万级的数据,对于B+树只需要三层,对于B树却需要远超3层的一个指数级节点数,而且对于范围查找也是B+树更擅长的,因为B+树在叶子节点之间之间放了一个双向指针,而且是排好序的数据,更方便查找范围数据

注:其实也可以选择使用hash结构存储,但是hash存储是不能解决范围查找的问题的,所以还是B+树更优

索引

索引的定义:索引是帮助mysql高效获取数据的排好序的数据结构

以上的定义对于理解索引的操作非常重要

对于根节点来说,其是常驻内存的

我们知道对于表规范来说我们应该在设计表的时候加上id  开始时间  更新时间

通常id设置为整形自增主键  

为啥是自增主键呢??

选择整形是因为其占用的内存小,相对来说查找较快  以前使用uuid占用内存就比较大

自增是为了不导致树的平衡和节点拆分操作

我们举个例子

假设我先插入7 再插入 8 可能就是对树的大节点进行拆分,还对树进行了平衡操作,效率降低了

所以这里建议使用自增主键

相对来说使用自增主键的效率更高

二级索引

我们知道对于mysql还有二级索引

那么二级索引又是怎么存储的呢?

二级索引的索引树叶子节点存储的就是索引信息和主键信息

对于二级索引索引树包含的信息使用它会更快

但是一旦超出的他的数据范围,就需要一个回表的操作了

因为二级索引树的信息不能包含所有的信息

只能根据其主键来去主键的索引树查询了

这样来说效率反而会降低,不如直接使用主键索引树的聚集查询

explain工具

我们知道explain关键字可以查询到sql语句中对应的sql执行信息,方便我们进行sql的优化

下面我们来介绍一下有关的信息

1.select_type   语句的复杂程度

一般有三种

simple   sqlquery子查询   derived延伸查询 

延伸查询是在from后面临时生成的临时表

2.partitions   

分区  一般不使用

对于数据多的直接使用分库分表了

3.type   

可以查看估算到sql语句执行的效率

下面我们来一个一个介绍一下这里的表示

1.system 

 表示这个表只有一个字段,使用唯一索引直接就查找到了

2.const 

表示查找的时候使用唯一索引   就跟查询一个常量一样快

我们可以理解为system是const 的一个特殊情况

system的数据更少

3.eq_ref

equal_reference 表示连接的时候使用主键索引

这时候因为使用了唯一性索引就出来不需要比较

4.ref 

在连接的时候没有使用唯一性索引

但是使用了索引可能使用了二级索引等等

查出来可能是多条数据要进行比较

5.range

范围查找  

使用主键索引来检索给定范围的行

因为是有序的,还是能使用索引的

6.index

全索引扫描   

这里使用的是二级索引进行范围查找

7.all 

效率最低的全表扫描

不使用索引

key_len

这里表示的就是使用联合索引的哪个字段

比如说使用了int类的字段就是4表示4个字节...

extra

额外信息

这里说几个常见的

Using index 

使用覆盖索引

这里的覆盖索引指的不是一种索引 而是一种查找索引的方式

这里就是表示二级索引的索引树叶子节点已经包含了全部信息

这里就无需再进行回表使用主键索引树继续查找了

Using where 

查询的列没被索引覆盖

Using index condition

用到了临时表  比如使用了distinct进行去重 ,这里如果用到索引树就直接去拿

没用到索引树就得创建一个临时表

Using filesort

使用外部排序   在orderby的时候会出现   

如果没使用索引就会出现外部排序

这里使用临时表和外部排序的都需要被优化掉,使用索引去覆盖即可

使用全值索引更快

顺序换了一下也会走索引,但是最好不要,因为mysql底层会进行一定程度的运算,会降低效率

注:不要在索引上做一些运算操作,因为这样会导致索引树无法定位

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/600710.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JUC基础

1.JUC概念 JUC是文件Java官方文档下面的java.Util下面的工具包。作用于多线程,内容有lock锁,以及callable等内容。JDK官方文档路径。基础多线程不了解可以看多线程子线程结束,执行主线程 2.线程、进程 1.进程: 一个程序是线程…

Python第四次作业

周六: 1. 找出10000以内能被5或6整除,但不能被两者同时整除的数(函数) def find_number():for number in range(0,10000):if number % 5 0 or number % 6 0:if number % 5 ! number % 6:ls.append(number)print(ls)ls [] fin…

如何快速摸清一个行业?

作为一名职场人,或多或少都会遇到需要了解自己不熟悉的行业,比如: 职业选择,跳槽换工作时:哪家企业所在的行业有优势,未来会有更多的机会?哪个行业给的薪资会更高?行业内当下及未来的…

MATLAB | 怎样绘制更有立体感的柱状图

之前写了一篇文章说明了MATLAB图例可以自己diy,这次又有了diy的机会,我开发了一个简单的小工具,能够实现绘制伪3d的柱状图,大概效果如下: 使用说明 由于涉及的代码比较接近MATLAB底层的图形对象,有点东西还…

Qt使用iostream的cout

在QT想使用iostream的cout。 参考以下博客: (转载)Qt中使用cout输出的方法 pro里加上; CONFIG console勾选 Run in Terminal clean工程,重新构建 上面是cout的,下面是我的另一个函数的qDebug输出的。

Set及其实现类与常用方法

1.Set及其常用实现类 Set接口是java.util.Collection接口的子接口.用来存储一个一个的数据.后面学习到的Map接口则用来存储key-value键值对. Set : 存储无序的,不可重复的数据|----->HashSet : 主要实现类 : 底层使用的是HashMap,即使用数组单向链表红黑树来存储。|-----&…

数据挖掘及其近年来研究热点介绍

🎀个人主页: https://zhangxiaoshu.blog.csdn.net 📢欢迎大家:关注🔍点赞👍评论📝收藏⭐️,如有错误敬请指正! 💕未来很长,值得我们全力奔赴更美好的生活&…

如何实现异地公网环境访问本地部署的支付宝沙箱环境调试支付SDK

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

OpenHarmony实战:轻量系统STM32F407芯片移植案例

介绍基于STM32F407IGT6芯片在拓维信息Niobe407开发板上移植OpenHarmony LiteOS-M轻量系统,提供交通、工业领域开发板解决方案。 移植架构采用Board与SoC分离方案,使用arm gcc工具链Newlib C库,实现了lwip、littlefs、hdf等子系统及组件的适配…

数据同步工具datax配置与示例

文章目录 前言一、部署步骤1、jdk环境2、python环境步骤一:安装方式一:官网下载安装包方式二:brew命令安装 步骤二:配置环境变量步骤三:验证 3、maven环境(可选) 二、下载安装datax1、下载datax…

前端自动化测试-Jest

前端自动化测试 Jest官网:https://jestjs.io 安装方式 npm install --save-dev jest yarn add --dev jest cnpm add --save-dev jest 使用方法 所有以 .test.js 结尾的都是测试文件 基础用法示例 num.js: export function getSum (a, b) {return a b…

【三十七】【算法分析与设计】STL 练习,凌波微步,栈和排序,吐泡泡,[HNOI2003]操作系统,优先队列自定义类型

凌波微步 链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 时间限制:C/C 1 秒,其他语言 2 秒 空间限制:C/C 32768K,其他语言 65536K 64bit IO Format: %lld 题目描述 小 Z 的体型实在是太胖了&…