Mysql的page,索引,Explain Type等基本常识

news2025/1/20 20:12:07

Mysql的基本问题

Mysql 为什么建议使用自增id?

  1. 因为id(主键)是自增的话,那么在有序的保存用户数据到页中的时候,可以天然的保存,并且是在聚集索引(id)中的叶子节点可以很好的减少插入和移动操作,可以提高效率。
  2. int或者bigInt占用的字符不是很大,并且方便保存或者建立索引

什么是回表?

索引分为两种

  1. primary index,通常也是clustered index(聚集、聚簇索引),它的叶子节点会保存实际的物理数据
  2. secondary index,通常也是辅助索引,非聚集索引,它叶子几点保存为主键,而不是实际的物理数据,一般来说除了主键索引,一般都是这个,因为为了降低索引的成本而设计的

如果通过secondary index查出了需要的数据行,但是在secondary index中没有需要的列怎么办呢?那就只能获取id,然后在primary index中去读取全部数据了,这个过程叫做回表。

什么是索引覆盖

和回表相比,假设查询的属性列都在secondary index中呢?我们还需要回表操作吗?显然不需要,那么这个时候呢?secondary index的工作覆盖了primary index的工作,这就叫索引覆盖,Explain中的extra通常会显示using index
在这里插入图片描述

什么是ICP?(index condition pushdown)

Index Condition Pushdown (ICP) is an optimization for the case where MySQL retrieves rows from a table using an index. Without ICP, the storage engine traverses the index to locate rows in the base table and returns them to the MySQL server which evaluates the WHERE condition for the rows. With ICP enabled, and if parts of the WHERE condition can be evaluated by using only columns from the index, the MySQL server pushes this part of the WHERE condition down to the storage engine. The storage engine then evaluates the pushed index condition by using the index entry and only if this is satisfied is the row read from the table. ICP can reduce the number of times the storage engine must access the base table and the number of times the MySQL server must access the storage engine.

如果没有ICP,那么正常流程是这样的
在这里插入图片描述
ICP优化下,流程是这样的
在这里插入图片描述
简单来说,就是如果index中存在where的过滤条件中的列但是因为最左原则或者其他的原因,导致index不能直接匹配的条件过去是先通过索引找到列,在放到缓存里过滤,现在这个过滤过程,放在index匹配的过程中了,匹配完再去表读取数据,这样就提升了读取速度。

但这个通常是有条件的:

  1. ICP is used for the range, ref, eq_ref, and ref_or_null access methods when there is a need to access full table rows. (需要回表操作)
  2. For InnoDB tables, ICP is used only for secondary indexes. The goal of ICP is to reduce the number of full-row reads and thereby reduce I/O operations. For InnoDB clustered indexes, the complete record is already read into the InnoDB buffer. Using ICP in this case does not reduce I/O. (需要辅助索引)
  3. Conditions that refer to subqueries cannot be pushed down.(子查询无法下沉)

有其他条件参考 ICP

Explain下type的类型

mysql explain type 访问类型解读

type显示的是访问类型,是一个较为重要的指标,值从优到劣分别为: system > const > eq_ref > ref > range > index > all

  1. system
    访问类型最高的,属于const类型的特例,表只有一条记录行(=系统表),一般不会出现这个,可以忽略.

  2. const
    表示通过索引一次就能找到, const 用于比较primary或者unique(值是唯一的).因为只匹配一条数据,所以很快. 如果将主键置于where 子句中,mysql就能将该查询转为一个常量
    在这里插入图片描述

  3. eq_ref
    唯一性索引扫描,对于每个索引建,表中只有一条记录与之对应,常见于唯一扫描或索引扫描.
    与const不同的是eq_ref用于联合表的查询.读取连接表的一行,是system,const之外最好的连接类型.

SELECT * FROM bt_order left JOIN mt_user on (mt_user.id = bt_order.user_id)

在这里插入图片描述

It shows that one row is fetched from this table for each combination of rows of the previous table. If all the parts of the primary index or the unique not null index are used to fetch the data then the type is eq_ref

更偏重于表示一行数据通过了主键或者索引来锁定了这样的一个概念,而且这里会有个连表或者其他的组合‘combine’概念

  1. ref
    非唯一索引扫描,返回匹配某个单独值的所有行.本质上也是一种索引访问,返回匹配单个值的所有行. 他可能会找到多个符合条件的行,所以说索引应该属于查找与扫描的混合体
    在这里插入图片描述

The ref access method is slightly less efficient than const, but still an excellent choice if the right index is in place. Ref access is used when the query includes an indexed column that is being matched by an equality operator. If MySQL can locate the necessary rows based on the index, it can avoid scanning the entire table, speeding up the query considerably.

注意看到了吗? by an equality operator,表示用 =,如果不是话可能就会不同了
在这里插入图片描述
5. range
只检索给定范围的行,返回匹配指定区间的所有行,一般就是你的where子句中出现了如 between and , in , <,>等 的这种查询. 这种范围扫描的索引扫描比全表扫描要好,因为他只用开始于索引的某一点,结束与索引的某一点,不用扫描全部索引
在这里插入图片描述

When you use range in the where clause, MySQL knows that it will need to look through a range of values to find the right data. MySQL will use the B-Tree index to traverse from the top of the tree down to the first value of the range. From there, MySQL consults the linked list at the bottom of the tree to find the rows with values in the desired range. It’s essential to note that MySQL will examine every element in the range until a mismatch is found, so this can be slower than some of the other methods mentioned so far

上面有个概念:遍历直到不匹配,所以会性能比不过上面的几个

  1. index
    Full index Scan ,与all 不同的是,index 为index类型只遍历索引数,这通常比all快,因为索引文件通常比数据文件小. 也就是说虽然all和index都是读全表,但是index是从index中读取的,而all是从磁盘读取的.

The index access method indicates that MySQL is scanning the entire index to locate the necessary data. Index access is the slowest access method listed so far, but it is still faster than scanning the entire table. When MySQL cannot use a primary or unique index, it will use index access if an index is available.

在这里插入图片描述
cannot use a primary or unique index, it will use index access if an index is available 这是指主键或者唯一键不可以使用+读取的属性列(necessary data)在索引中,不需要回表,否则会变成all
在这里插入图片描述
7. all
Full table Scan , 全表扫描,将遍历全表以找到匹配的行
在这里插入图片描述
性能最低的,没什么好说的。

附录:

Explain的各个字段的意义
在这里插入图片描述

Extra的一些可能存在的信息

Mysql的基本结构

Page

通常为了提高列表的查询速度,我们会简历目录来分组,同时指定对应的地址坐标

在这里插入图片描述
建立页目录的思想和文章目录,redis zset中的skipList的逻辑大差不差,只是不是树结构而已,但本质上依然是分治思想。

  1. 用户数据区,会通过主键来排序,所以,自增id会是很好的,效率比较高的主键选择方案
  2. 每页保存的数据条数是有限的,可以粗略的计算,假设为每条数据大小为1k,那么一页大概能保存16/1 = 16条数据
  3. 每页都有指向下一页和上一页的地址指针。

如何基于page来建立索引?

我们都知道叶子节点是数据(对于聚集索引来说),那么我们该如何建立索引呢?假设当前的实际数据页如下:
在这里插入图片描述
基于页的目录来说,我们可以提取一层索引(当前是基于聚集索引),建立索引的过程为,我们会在索引页中保存每个叶子结点的开始id(int=4b)和地址指针(6b)
在这里插入图片描述
那么 一页的索引可以保存多少条索引数据呢?
16k/10b = 161024/10 = 1638
所以,如果是只有两层的索引的话,那么只能保存1638 * 16条数据,这显然是不够的,为了提升索引支持的数据,我们再加 一层,也就是三层,因为加的索引页结构是不变的,那么root的索引页可以保存 16k/10 = 1638个索引数据,总结起来就是
1638
1638*16 = 42928704,约4kw条数据,但是这是理想状态下,正常来说是约为2kw条数据左右。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32H750+LAN8720无操作系统移植lwip

前言 本文提供移植好的工程&#xff0c;见本文绑定资源 环境 STM32CubeMX&#xff1a; V6.8.1 STM32H7 HAL Pack&#xff1a; V1.11.1 硬件连接 STM32H750 GPIO定义如下&#xff1a; LAN8720 GPIO定义如下&#xff1a; 连接方式如下&#xff1a; LAN8720       <—…

翻斗式雨量计入选【2023年济南市重点工业新产品】名单

近日&#xff0c;济南市工业和信息化局发布了【2023年济南市重点工业新产品】名单&#xff0c;山东仁科测控技术有限公司“翻斗式雨量计”成功入选。 为深入实施工业强市战略&#xff0c;切实加强创新示范推广与应用&#xff0c;鼓励企业研发新技术、新产品、新工艺&#xff0…

Android Native Code开发学习(三)对java中的对象变量进行操作

Android Native Code开发学习&#xff08;三&#xff09; 本教程为native code学习笔记&#xff0c;希望能够帮到有需要的人 我的电脑系统为ubuntu 22.04&#xff0c;当然windows也是可以的&#xff0c;区别不大 对java中的对象变量进行操作 首先我们新建一个java的类 pub…

全画面塑料激光透光率测试仪

随着光学塑料成型技术的不断发展&#xff0c;光学塑料透镜在各类光学系统中得到了广泛的应用。光学塑料具有便于大批量生产&#xff0c;设计灵活性高&#xff0c;重量轻和耐冲击等特点。最近几年来&#xff0c;国内外有许多专家学者对热塑性半结晶塑料激光焊接工艺上的应用进行…

Java入门第四节

Java入门第四节 一.继承 问题&#xff1a; 隔壁的王阿姨养了一只猫和一只仓鼠&#xff0c;也想使用这个app&#xff0c;应该这么办 解决&#xff1a; 1.找出所有动物的共性(如.有名字&#xff0c;品种&#xff0c;年龄&#xff0c;吃饭&#xff0c;跑等等)&#xff0c;创建…

IDEA工具栏快捷按钮

如图 点击快速弹出创建class. 主要我9.9的鼠标右键不灵敏 方法 在工具栏右键 横杠出点 Add Action 没有横杠就点下一个

QLabel控件使用

Qt为我们应用程序界面开发提供的一系列的控件&#xff0c;下面我们介绍两种最常用一些控件&#xff0c;所有控件的使用方法我们都可以通过帮助文档获取。 1.QLabel控件使用 QLabel是我们最常用的控件之一&#xff0c;其功能很强大&#xff0c;我们可以用来显示文本&#xff0c…

0830hw

1.2.链式队列 head.h #include <myhead.h> typedef int datatype; typedef struct seq {union{datatype data;int len;};struct seq *next; }seq,*S; typedef struct PP {S front;S rear; }P; P *create(); void input_tail(P *p,datatype n); void pop_head(P *p); vo…

Python程序化交易接口批量获取数据源码

小编举例下面是一个简单的示例代码&#xff0c;展示如何使用Python的程序化交易接口批量获取数据&#xff0c;例如开发文档参考&#xff1a;MetaTradeAPI (metatradeapi) - Gitee.com 签名 int Init(); 功能 API 初始化 参数 无 返回值 授权成功的交易账户数量 返回值 &…

使用STM32与TB6612FNG驱动直流减速电机

TB6612FNG介绍 单片机引脚的电流一般只有几十个毫安&#xff0c;无法驱动电机&#xff0c;因此一般是通过单片机控制电机驱动芯片进而控制电机。TB6612是比较常用的电机驱动芯片之一。 TB6612FNG可以同时控制两个电机&#xff0c;工作电流1.2A&#xff0c;最大电流3.2A。 AIN…

Java里面对int[]数组做新增删除去重实现

Java里面对int[]数组做新增删除去重实现 说明代码根据索引删除数组中的某个数据实现在数组中添加一个元素实现删除数组里面的重复数据去掉数组里面的重复数据&#xff0c;只保留一个 说明 这里记录下使用int[]数组对数组进行新增删除去重等操作&#xff0c;用来更加了解java里…

部署单点elasticsearch

部署elasticsearch 创建网络 因为我们还需要部署kibana容器&#xff0c;因此需要让es和kibana容器互联。这里先创建一个网络 docker network create es-net 拉取镜像 我们采用elasticsearch的7.12.1版本的镜像 docker pull elasticsearch:7.12.1 运行 运行docker命令&a…

编译KArchive在windows10下

使用QT6和VS2019编译KArchive的简要步骤&#xff1a; 安装 Qt &#xff0c;我是用源码自己编译的 "F:\qtbuild"安装CMakefile并配置环境变量安装Git下载ECM源码 https://github.com/KDE/extra-cmake-modules.git-------------------------------------------------…

springboot docker

在Spring Boot中使用Docker可以帮助你将应用程序与其依赖的容器化&#xff0c;并简化部署和管理过程。 当你在Spring Boot中使用Docker时&#xff0c;你的代码不需要特殊的更改。你可以按照通常的方式编写Spring Boot应用程序。 java示例代码&#xff0c;展示了如何编写一个基…

如何飞速成为开源贡献者(Contributor)

如何飞速成为开源贡献者Contributor 一、环境信息1.1 硬件信息1.2 软件信息 二、Git安装2.1 Git介绍2.2 Git下载安装 三、开源项目选定四、GitHub参与开源流程4.1 Fork项目4.2 SSH配置4.2.1 为什么要配置SSH4.2.2 如何配置SSH 4.3 Clone项目4.4 IDEA关联4.5 PR生成4.6 PR提交 一…

电脑突然提示msvcr120.dll错误的解决方法,最全面的解决方法

今天&#xff0c;我将和大家分享一种常见的电脑问题——电脑突然提示msvcr120.dll错误的解决方法。希望通过这次演讲&#xff0c;能够帮助大家解决这个问题&#xff0c;提高大家的电脑使用效率。首先&#xff0c;让我们来了解一下msvcr120.dll是什么。msvcr120.dll是Microsoft …

CMH检验

前言 CMH检验&#xff08;Cochran-Mantel-Haenszel Test&#xff09;&#xff0c;分层卡方检验&#xff0c;考虑中心效应&#xff0c;分析干预对结果的影响。如果存在中心效应&#xff0c;即干预结果与中心相关&#xff0c;那么简单的将中心数据合并做卡方分析并不合理。需要采…

记事本编辑代码出错?编程初学者为什么不要用系统文本编辑器? 文本编辑器踩坑指南,代码格式化无效,写代码必看

题目: 写一段判断 2 到 10 之间的质数的输出 环境 左: VScode 右: Windows 文本编辑器(记事本) 目录 代码展示 原视频介绍 图文介绍 更离谱的是使用vscode 一键格式化 摆烂??? 最终手动缩进才解决问题 解决问题 那么问题究竟出在哪里? 文本比较即可 还是不够直…

“媒体+”时代正当时,ATEN以前瞻解决方案助推媒体融合纵深发展

自媒体融合概念提出以来,传统媒体与新媒体融合速度加快,两者的相互结合与优势互补为广电行业发展提供了新的契机,更加多元化、个性化、强互动的“媒体”传播格局已逐渐形成。 “媒体”理念的创建,对于广电行业而言无疑是一种积极的改革创新之举,然而“媒体”的发展也呈现出泛媒…

Redis与Mysql区别

一、关系型数据库 mysql&#xff0c;pgsql,oracle ,sqlserver 支持连表关联查询&#xff08;会有一些特定的语法特特性&#xff09; 二、非关系型数据库 redis,mongodb,memcache &#xff08;key-value&#xff09; 三、关系型数据库与非关系型数据库的区别&#xff1a; 1&am…