Jmeter 压测保姆级入门教程
1、Jmeter本地安装
1.1、下载安装
软件下载地址: https://mirrors.tuna.tsinghua.edu.cn/apache/jmeter/binaries/
选择一个压缩包下载即可

然后解压缩后进入bin目录直接执行命令jmeter即可启动

1.2 修改语言
默认是英文的,修改中文,点击选项-》选择语言-》简体中文

1.3 必备插件安装
jmeter内置的常用的插件不是很多,如果要额外安装其他插件需要先下载一个插件安装工具的jar包然后放到jmeter的目录下才能使用插件安装工具的功能。
- 插件安装工具下载地址

2) 下载jar包之后放到 jmeter的 /lib/ext 目录下,重启Jmeter即可。
3 打开插件管理。 选项-》 插件管理器

- 点击可用插件tab,然后勾选安装即可

推荐勾选: 带jpgc相关的插件,可以做梯度增压
1.4 修改Jmeter的堆内存
由于压测是通过Jmeter这个Java程序去跑的,所以压测的性能和能开启的线程数量都与这个程序本身运行的环境以及配置有关。 一般Jmeter部署在服务器那边性能会更强。
修改jmeter的 /bin/jmeter 文件 (mac环境),如果是window修改 jmeter.bat 。 修改下图的这一行就是调整堆内存信息
${HEAP:=“-Xms1g -Xmx8g -XX:MaxMetaspaceSize=656m”}

验证是否修改成功,重启使用jconsole工具连接Jmeter进程查看jvm信息即可看到是否修改成功。 或者使用jps命令查看进程号然后再jmap命令查看堆内存分配情况。

2、 Jmeter操作说明
2.1、测试计划
默认打开的界面如下, 一份测试计划就是一份jmx文件,点击保存就会弹出保存地址。 测试计划就是包含此次做压测的所有信息。 支持导入导出。

2.2 测试计划界面介绍
异常信息
- 右上角那个小三角可以看到jemter的执行信息,如果你的压测执行不了可以去里面看看一般是报错了
用户自定义变量
- 可以在这里配置压测的全局变量,这样我们在使用的时候就不用传具体的值,传变量的值即可。 这样以后要修改的话只需要修改这里的变量值就可以了就不用到处都修改了。
- 比如我们压测的接口的域名肯定是都一样所以一般会提取出来做全局变量。比如下面配置全局变量域名host, 然后使用的时候就直接配
${host}即可。

2.3、配置元件
默认支持的配置元件列表,主要作用就是配置我们压测接口的一些参数配置

2.3.1、Http请求默认值
操作: 右键点击测试计划-》 添加-》 配置元件-》 Http请求默认值组件
作用:
- 一般压测的接口的很多请求参数可能是一致的。 所以这里可以设置压测接口时的默认请求参数。 这样就不用每次配压测接口都去配置,默认会带上这里配置的请求参数。

比如下图配置默认的http协议,以及默认的域名。 这里的域名配置就使用我们前面配置的全局变量 ${host}了

2.3.2、HTTP信息头管理器
操作: 右键点击测试计划-》 添加-》 配置元件-》 HTTP信息头管理器
作用:
- 与
Http请求默认值配置元件类似,都是配置压测接口的请求默认值。 不过这个元件就像其名字一样配置的是默认的Http请求头信息,这样压测接口就不用再配置Http请求头信息默认会带上 - 比如我们可以配置常用的默认的请求头
Content-Type和Cookie。 尤其是Cookie请求头 这样即使是登录接口也能进行调通。

2.3.3、CSV Data Set Config
操作: 右键点击测试计划-》 添加-》 配置元件-》 CSV Data Set Config
作用:
- 一般用于模拟生成不同的请求参数。 因为一般我们对一个接口进行压测真实的场景是请求参数是不同的
具体配置如下:
- 主要是先配置一个csv文件的地址,然后指定列头变量字段名。 之后再配置压测接口的时候就可以把使用这些变量字段名。使用格式为:
{变量名称}。 比如下面配置使用格式就是{userName}. - 这样在请求压测接口的时候就会来随机读取这个csv文件的这个变量对应的列的某一个的值, 一般我们就是通过这个组件去模拟不同的请求参数。

2.4、线程组
线程组就是用来模拟并发的数量以及并发的行为。 比如你是要启动10个并发还是100个并发去压测接口就是通过这个组件。并且启动压测程序其实就是通过启动我们的线程组的执行压测。
自带带的线程组如下,其中带gc的使我们添加插件后才有的。 不同的线程组的区别就是设置的并发行为不同。
-
比如有些线程组是一股脑配10个并发然后一直执行10分钟。
-
有些线程组是配置先启动1个并发,每过5秒后再启动10个并发,当到达100个并发后就执行10分钟。

2.4.1、普通线程组
操作: 右键点击测试计划-》 添加-》 线程-》 线程组
作用:
- 下图就是我们配置一个线程组, 配置了20个并发,然后在5秒内启动完20个并发,当执行10000伺候就停止压测。

具体该配置的并发行为可以用下图来形象的表示。 可以看到一开始是0个并发,然后随着时间增加不短增加并发,最终在第5秒达到最大并发20,然后就一直20个并发一直执行。

2.4.2、梯度线程组(Stepping Thread Group)
操作: 右键点击测试计划-》 添加-》 线程-》 jp@gc - Stepping Thread Group
作用:
- 与普通线程组的并发行为不同的是,这个线程组可以做到类似于先启动5个并发,然后隔10秒后再启动10个并发,当达到100个并发,持续执行30s,然后再每隔5秒降低20个并发这种更为详细的并发行为。 而普通线程组每次只能保持固定的并发数去跑, 我们只能不断修改这个固定的并发数去压测以求找到接口最大的吞吐量。 下图就形象的表示了这种驼峰式的并发行为

具体配置对应的语义和并发行为如下图所示:
this goup will start语义: 表示最多启动多大线程。对应图中的峰顶的值first wait for语义:从运行之后多长时间开始启动线程;若设置为60秒, 对应图中开头的底部横线。then start语义:表示第一次要启动几个线程。 对应图中第一个上升线。next add语义 + threads every 语义:表示每隔多少秒启动多少个线程。对应图中的上升梯度线。using ramp-up 语义:其中与普通线程组一样表示启动线程的时间。 对应图中的上升梯度线的斜度,越大越斜表示用的时间越久。then hold load for语义:表示达到最大线程后保持最大线程持续执行多久。 对应图中的峰顶的横线。finally sotp + threads every语义:达到峰顶后,表示每隔多少秒释放多个线程。 对应图中的下降梯度线。
2.5、取样器
如果说线程组就是我们Java的线程池,那么取样器就相当于我们线程池要执行的Runnable任务。比如我们要压测哪个接口就可以配置成取样器。
自带取样器如下
- 操作: 右键线程组-》 添加-》取样器
- 一般我们用的比较多就是Http请求取样器,用来压测接口。

2.5.1、Http请求取样器
操作: 右键线程组-》 添加-》取样器-》 Http请求
作用: 主要就是用来配置Http接口的信息,包括请求域名,端口,接口路径、接口参数等等。 有了它就可以发起请求。

3、 实战案例
此处压测的接口代码逻辑: 模拟执行时间是500ms
@GetMappingpublic String getA1(){try {Thread.sleep(500);} catch (InterruptedException e) {throw new RuntimeException(e);}return "33";}
3.1、 压测接口Hello World
1、在测试计划下面添加线程组,设置100个并发,持续执行600秒。

2、添加压测的接口
添加http取样器,并且配置接口信息

3、添加接口执行结果监听器
操作: 右键线程组-》添加-》监听器-》查看结果树。
这样我们接口是否调通以及返回结果都可以看到

4、添加压测接口汇总报告
操作: 右键线程组-》添加-》监听器-》汇总报告。
这样看到这个线程组压测的统计报告,包括吞吐量TPS、响应时间、是否异常,网络请求量,执行次数。

5、添加吞吐量TPS实时统计图(可忽略)
操作: 右键线程组-》添加-》监听器-》jp@gc - Transactions per Second。
这样就可以监测吞吐量的实时变化情况。

5、添加响应时间实时统计图(可忽略)
操作: 右键线程组-》添加-》监听器-》jp@gc - Response Times Over Time
这样就可以监测接口响应时间的实时变化情况。

5、添加激活线程实时统计图(可忽略)
操作: 右键线程组-》添加-》监听器-》jp@gc - Active Threads Over Time
这样就可以监测线程组的并发行为,因为线程组的组件有很多,如果不是非常熟悉可能都不知道自己配置的线程组正在模拟什么样的并发行为。

7、启动线程组执行压测
操作: 右键线程组-》启动
原理: 线程组会去并发执行线程组下面配置的所有取样器(这里只添加了一个还可添加多个)
最后我们看下各部分压测结果:
1、首先是接口执行情况:
- 都是绿色表示接口调通,并且右侧可看到接口响应结果。

2、看一下压测汇总报告统计
可以看到样本数就是总共请求的数量, 平均值就是平均响应时间(单位是毫秒)结果跟我们接口代码逻辑还是一致的,最小值和最大值也是接口响应时间。 异常率就是接口调不通(吞不下)的概率。 吞吐量就是每秒能处理168个请求。

3、看一下吞吐量变化情况
随着并发数增加,最终一直维持在180到200的吞吐量之间

3、看下响应时间的变化
基本维持在500ms左右

3.2、 模拟不同的请求参数
1、新建一个CSV文件,里面放我们不同的请求参数,比如内容为
userId,userName
1, zhangShan
2, liSi
3, xaioming
2、新增CSV 数据文件设置组件
将我们刚才新增的csv文件路径配到这里,然后配置变量名,并且设置忽略首行(因为我们的csv文件内容首行不是请求参数)

3、在Http取样器里面直接使用变量即可。
请求参数要使用变量地方就用{}包起来就行。
原理就是请求的时候会去随机读取该文件的的这个字段的值从而达到模拟不同请求参数的效果

3.3、 如何请求要登录验证的接口
这个看你们的登录验证逻辑,假如我们的登录信息是放在cookies里面,那么我们就可以添加HTTP信息头管理器,然后在里面配置cookie请求头信息。只要把我们的登录cookies放进去就可以执行成功。

缺点就是cookie失效后每次要重新配置,具体还有其他更自动化的解决方法
3.4、 接口如何上传文件
接口配置那选择文件上传, 配置配置具体的配置路径即可。会去读取上传。 然后参数名称写死file就行。 然后MIME根据具体来。 一般是application/octet-stream 或者 multipart/form-data即可。
如果要模拟上传不同的文件,同上面模拟不同请求参数一样,这里用变量填充代表文件路径即可。

3.5、 如何在服务端执行Jmeter压测(重要)
之前我们是通过本地Jmeter的GUI界面去进行压测的。但是官方不建议压测通过GUI模式去跑,而是使用CLI命令行的模式去跑压测。 所以我们得先准备测试计划文件.jmx, 然后使用jmeter的命令去跑测试计划。最终会将测试计划的结果报告保存到指定的文件。
具体命令:
jmeter -n -t [xxx.jmx] -l [results file] -e -o [Path to web report folder]
- -n:非GUI模式,即在非客户端模式下运行JMeter
- -t:指定待执行的JMeter脚本
- xxx.jmx是要被执行的JMeter测试计划脚本即在JMeter客户端保存的脚本
- -l: 指定相关结果到指定的文件中
- results file就是压测结果保存的文件名,默认存放在命令行当前目录下
- Path to web report folder 就是报告目录路径
其实细心的可能会发现我们启动jmeter的日志输出默认就是告诉我们应该这样做
具体的官方文档: https://jmeter.apache.org/usermanual/best-practices.html

以下是我的执行命令案例:
jmeter -n -t 1.1版本xx测试计划.jmx -l result.txt -e -o report
(base) ➜ tmp6 ll
-rw-r--r--@ 1 burukeyou staff 16K 11 23 14:19 1.1版本xx测试计划.jmx
(base) ➜ tmp6 jmeter -n -t 1.1版本xx测试计划.jmx -l result.txt -e -o report
Creating summariser <summary>
Created the tree successfully using 1.1版本xx测试计划.jmx
Starting standalone test @ November 23, 2023 2:21:03 PM CST (1700720463057)
Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445
summary + 1 in 00:00:01 = 1.6/s Avg: 556 Min: 556 Max: 556 Err: 0 (0.00%) Active: 13 Started: 13 Finished: 0
summary + 299 in 00:00:06 = 50.9/s Avg: 509 Min: 504 Max: 556 Err: 0 (0.00%) Active: 0 Started: 100 Finished: 100
summary = 300 in 00:00:07 = 46.0/s Avg: 510 Min: 504 Max: 556 Err: 0 (0.00%)
Tidying up ... @ November 23, 2023 2:21:09 PM CST (1700720469740)
... end of run
(base) ➜ tmp6 ll
total 216
-rw-r--r--@ 1 burukeyou staff 16K 11 23 14:19 1.1版本xx测试计划.jmx
-rw-r--r-- 1 burukeyou staff 44K 11 23 14:21 jmeter.log
drwxr-xr-x 6 burukeyou staff 192B 11 23 14:21 report
-rw-r--r-- 1 burukeyou staff 41K 11 23 14:21 result.txt
可以发现跑完压测报告后最终在生成了result.txt文件和report目录,进入report目录找到index.html浏览器打开即可看到报告如下

jmeter -n -t [xxx.jmx] -l [results file]执行压测也可不指定 Path to web report folder参数。 只生成 results file. 然后通过 jmeter -g result.txt -o output 命令使用结果文件去生成Html报告。
比如:
(base) ➜ tmp6 ll
total 136
-rw-r--r--@ 1 burukeyou staff 16K 11 23 14:19 1.1版本xx测试计划.jmx
-rw-r--r-- 1 burukeyou staff 5.3K 11 23 14:26 jmeter.log
-rw-r--r--@ 1 burukeyou staff 41K 11 23 14:21 result.txt
(base) ➜ tmp6 jmeter -g result.txt -o output
(base) ➜ tmp6 ll
total 152
-rw-r--r--@ 1 burukeyou staff 16K 11 23 14:19 1.1版本xx测试计划.jmx
-rw-r--r-- 1 burukeyou staff 14K 11 23 14:29 jmeter.log
drwxr-xr-x 6 burukeyou staff 192B 11 23 14:29 output
-rw-r--r--@ 1 burukeyou staff 41K 11 23 14:21 result.txt
如果看压测的每个请求结果响应类似GUI界面那样,可以在jmeter的GUI界面的查看结果树组件的浏览那里导入结果文件即可。

相关文章:
Jmeter 压测保姆级入门教程
1、Jmeter本地安装 1.1、下载安装 软件下载地址: https://mirrors.tuna.tsinghua.edu.cn/apache/jmeter/binaries/ 选择一个压缩包下载即可 然后解压缩后进入bin目录直接执行命令jmeter即可启动 1.2 修改语言 默认是英文的,修改中文,点击…...
springboot2.1升级到2.7 actuator丢失部分metrics端点
项目场景: 项目需要升级springboot从2.1升级至2.7 问题描述 发现之前的metrics后面的jvm相关的端口丢了 原因分析: 找到这样一篇博文https://blog.csdn.net/CL_YD/article/details/120309094,这篇博文意思是对的,但是写的不太好…...
梦开始的地方——Adobe Premiere Pro
今天,我们来说说一款老生常谈的相信也是很多人都经常迫切需要的软件。Adobe Premiere Pro,简称Pr,是由Adobe公司开发的一款视频编辑软件。 Premiere Pro是视频编辑爱好者和专业人士必不可少的视频编辑工具。它可以提升您的创作能力和创作自由…...
Nginx同时支持Http和Https的配置详解
当配置Nginx同时支持HTTP和HTTPS时,需要进行以下步骤: 安装和配置SSL证书: 获得SSL证书:从可信任的证书颁发机构(CA)或使用自签名证书创建SSL证书。 将证书和私钥保存到服务器:将SSL证书和私钥…...
3.2 Windows驱动开发:内核CR3切换读写内存
CR3是一种控制寄存器,它是CPU中的一个专用寄存器,用于存储当前进程的页目录表的物理地址。在x86体系结构中,虚拟地址的翻译过程需要借助页表来完成。页表是由页目录表和页表组成的,页目录表存储了页表的物理地址,而页表…...
基于springBoot+Vue的停车管理系统
开发环境 IDEA JDK1.8 MySQL8.0Node 系统简介 本项目为前后端分离项目,前端使用vue,后端使用SpringBoot开发,主要的功能有用户管理,停车场管理,充值收费,用户可以注册登录系统,自主充值和预…...
ES开启安全认证
elasticsearch开启安全认证步骤 1.创建证书 进入到es主目录下执行 ./bin/elasticsearch-certutil ca Elasticsearch开启安全认证详细步骤 第一个证书名称默认,直接回车 第二个输入密码,直接回车 完成后会生成一个文件:elastic-stack-ca.p12…...
CS5511规格书|CS5511方案应用说明|DP转双路LVDS/eDP芯片方案
概述:CS5511是一个将DP/eDP输入转换为LVDS信号的桥接芯片,此外,CS5511可以用作在DP/eDP输入到DP/eDP输出场景中桥接芯片。CS5511的高级接收器支持VEDA DisplayPort(DP)1.3和嵌入式DisplayPort(eDP…...
JAVA小游戏“飞翔的小鸟”
第一步是创建项目 项目名自拟 第二步创建个包名 来规范class 再创建一个包 来存储照片 如下: package game; import java.awt.*; import javax.swing.*; import javax.imageio.ImageIO;public class Bird {Image image;int x,y;int width,height;int size;doubl…...
1410. HTML 实体解析器 --力扣 --JAVA
题目 「HTML 实体解析器」 是一种特殊的解析器,它将 HTML 代码作为输入,并用字符本身替换掉所有这些特殊的字符实体。 HTML 里这些特殊字符和它们对应的字符实体包括: 双引号:字符实体为 " ,对应的字符是 &qu…...
【开源】基于Vue.js的海南旅游景点推荐系统的设计和实现
项目编号: S 023 ,文末获取源码。 \color{red}{项目编号:S023,文末获取源码。} 项目编号:S023,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户端2.2 管理员端 三、系统展示四…...
机器学习【01】相关环境的安装
学习实例 参考资料:联邦学习实战{杨强}https://book.douban.com/subject/35436587/ 项目地址:https://github.com/FederatedAI/Practicing-Federated-Learning/tree/main/chapter03_Python_image_classification 一、环境准备 GPU安装CUDA、cuDNN pytho…...
微服务实战系列之签名Sign
前言 昨日恰逢“小雪”节气,今日寒风如约而至。清晨的马路上,除了洋洋洒洒的落叶,就是熙熙攘攘的上班族。眼看着,暖冬愈明显了,叶子来不及泛黄就告别了树。变化总是在不经意中发生,容不得半刻糊涂。 上集博…...
家用小型洗衣机哪款性价比高?口碑最好迷你洗衣机排行榜
由于我们的内衣、内裤和袜子等等贴身小件衣物的清洁频率比一般的衣物要高。而且,如果我们人工手洗的话,不仅会大大浪费了我们的时间,而且还不能进行对这些贴身的以为进行深层消毒和除菌。这种情况下,就得需要一台专门用于清洗内衣…...
企业远程访问业务系统:对比MPLS专线,贝锐蒲公英为何更优优势?
如今,企业大多都会采用OA、ERP、CRM等各种数字化业务系统。 私有云、公有云混合架构也变得越来越常见。 比如:研发系统部署在公司本地私有云、确保数据安全,OA采用公有云方案、满足随时随地访问需求。 如此一来,也产生了远程访问…...
Maven项目下详细的SSM整合流程
文章目录 🎉SSM整合流程一、两个容器整合✨ 1、先准备好数据库config.properties连接、mybatis-config.xml🎊 2、容器一:优先配置spring.xml文件🎊 3、容器二:配置springMVC.xml文件🎊 4、Tomcat整合spring…...
Linux 设置文件开启数量限制
1、限制某个用户的 vim /etc/security/limits.confroot soft nofile 65535 root hard nofile 65535 *soft nofile 65535 *hard nofile 65535第一行指root用户的每个进程可开启最大的文件数(软限制,只警告)第二行指root用户的每个进程可开启最…...
详解Java中的异常体系机构(throw,throws,try catch,finally)
目录 一.异常的概念 二.异常的体系结构 三.异常的处理 异常处理思路 LBYL:Look Before You Leap EAFP: Its Easier to Ask Forgiveness than Permission 异常抛出throw 异常的捕获 提醒声明throws try-catch捕获处理 finally的作用 四.自定义异常类 一.异…...
【jvm】虚拟机之堆
目录 一、堆的核心概述二、堆的内存细分(按分代收集理论设计)2.1 java7及以前2.2 java8及以后 三、堆内存大小3.1 说明3.2 参数设置3.3 默认大小3.4 手动设置3.5 jps3.6 jstat3.7 OutOfMemory举例 四、年轻代与老年代4.1 说明 五、对象分配过程5.1 说明5…...
二百零五、Flume——数据流监控工具Ganglia单机版安装以及使用Ganglia监控Flume任务的数据流(附流程截图)
一、目的 Flume采集Kafka的数据流需要实时监控,这时就需要用到监控工具Ganglia 二、Ganglia简介 Ganglia 由 gmond、gmetad 和 gweb 三部分组成。 (一)第一部分:gmond gmond(Ganglia Monitoring Daemon)…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
