SQL如何进行数据库性能基准测试?SELECT响应时间分析

夜浩吖_2758

夜浩吖_2758

2026-04-21

322人浏览

原创

MySQLslap测SELECT响应时间不准,因其仅提供平均值和总耗时,缺乏P95/P99等单次耗时分布;需用--no-defaults、--query指定真实SQL、--concurrency=1+--iterations=100逐条测量,并加--verbose排除连接干扰。

sql如何进行数据库性能基准测试?select响应时间分析

MySQLslap 测 SELECT 响应时间,为什么总不准

因为 mysqlslap 默认不记录单次查询耗时分布,只给平均值和总耗时,P95/P99 响应时间完全不可见。它把 500 次 SELECT 当成一个黑盒批次跑完再统计,中间抖动、长尾请求全被抹平。

真正要分析 SELECT 响应时间,得让它“逐条测、逐条记”:

  • 必须加 --no-defaults 避免读取全局配置干扰连接行为
  • 用 --query 指向含真实 WHERE 条件的 SQL 文件,别信 --auto-generate-sql 生成的假数据
  • 设 --concurrency=1 + --iterations=100,才能拿到 100 个独立响应时间点,后续导出用 Excel 算 P95
  • 加 --verbose 可看到每轮连接建立/销毁开销,排除网络或认证延迟干扰

sysbench 跑 OLTP 场景时,如何单独提取 SELECT 的 RT

sysbench 的 oltp_read_only 模式看似只做读,但默认混合了 POINT_SELECT、INDEX_RANGE、SCAN 三类查询,响应时间是加权平均值,不能代表你那条关键 SELECT id,name FROM users WHERE status=? 的真实表现。

要精准盯住某类 SELECT:

  • 改用 oltp_common 模式,配合自定义 Lua 脚本,在 thread_init 里预编译语句,event 中只执行目标查询
  • 禁用 --time 改用 --events=10000,避免时间截断导致样本不均
  • 输出日志加 --report-interval=1,再用 awk 提取 queries: 行里的 latency 字段,过滤出 type: point_select 的原始毫秒值
  • 注意:sysbench 3.0+ 才支持 per-query latency 输出,旧版本需打 patch 或换 pt-query-digest 解析 slow log

EXPLAIN 不显示响应时间,怎么知道 SELECT 实际卡在哪

EXPLAIN 只告诉你“计划怎么走”,不告诉你“走得多慢”。比如看到 type: range + rows: 12000,你以为慢在扫描,结果可能是 buffer pool 没预热,第一次访问全磁盘 IO;也可能是锁等待,EXPLAIN 根本不体现。

定位真实瓶颈得组合查:

  • 开 performance_schema,查 events_statements_history_long,过滤你的 SQL 文本,看 TIMER_WAIT(实际耗时)、LOCK_TIME(锁等待)、ROWS_AFFECTED(是否真扫了那么多行)
  • 执行前先 SELECT SLEEP(0.001) 占位,再跑目标 SELECT,用 SHOW PROFILE FOR QUERY N 看各阶段耗时(如 Creating sort index 占 80%,说明 ORDER BY 没走索引)
  • 对高并发 SELECT,抓 INFORMATION_SCHEMA.INNODB_TRX 和 INNODB_LOCK_WAITS,确认是不是被 UPDATE/DELETE 持锁阻塞

用 Python 脚本做 SELECT 基准测试,绕不开的三个坑

手写脚本看似灵活,但容易在连接管理、时钟精度、结果归一化上翻车。

常见陷阱:

  • 没复用连接:每次 cursor.execute() 都新建 TCP 连接,测出来全是三次握手+SSL 开销,不是 SQL 本身耗时 → 必须用连接池,如 SQLAlchemy.create_engine(pool_pre_ping=True)
  • 用 time.time() 测毫秒级差异,Windows 下精度只有 15ms,Linux 也常受系统调度影响 → 改用 time.perf_counter(),且每个 query 单独调用,不跨循环累加
  • 没清 buffer pool:第一次跑慢,后面全缓存,结果不可比 → 测试前执行 SET GLOBAL innodb_buffer_pool_dump_now=ON + SET GLOBAL innodb_buffer_pool_load_now=OFF 强制冷启动

最易被忽略的是查询参数绑定方式:用 cursor.execute("SELECT * FROM t WHERE id = %s", (x,)) 是安全的,但若拼接字符串 "SELECT * FROM t WHERE id = " + str(x),MySQL 会为每个不同 x 生成新执行计划,缓存失效,RT 波动剧烈。

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

3549

3

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

2023.07.25

2428

9

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

2023.08.02

1360

5

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.09

1298

4

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

2023.09.05

1416

5

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

2318

7

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

2023.09.20

3820

8

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

2023.09.22

17935

6

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

549

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习