【MySQL进阶】常用MySQL程序

发布于:2025-06-15 ⋅ 阅读:(20) ⋅ 点赞:(0)

目录

一. mysqlcheck——表维护程序

 1.1.作用

1.2 注意事项

1.3 使用方法

1.4 常用选项

1.5 mysqlcheck的特殊使用

二. mysqldump——数据库备份程序

2.1.作用

2.2 注意事项

2.3 使用方法

2.4 常用选项

三. mysqladmin——MySQL 服务器管理程序

3.1.作用

3.2 使用方法

3.3 支持的命令

3.4 常用选项

四.mysqlshow——显⽰数据库、表和列信息

4.1.作用

4.2.注意事项

4.3.使用方法

4.4.常用选项

五.mysqldumpslow - 总结慢查询日志文件

5.1 作用

5.2 注意事项

5.3 使用方法

5.4.常用选项

六. mysqlbinlog——处理二进制日志文件

6.1 作用

6.2 注意事项

6.3 使用方法

6.4常用选项

七.mysqlslap - 负载仿真客户端

7.1 作用

7.2 使用方法

7.3 注意事项

7.4.常用选项

7.5.示例


话接上篇,我们只讲了mysqld和mysql,但是还是有很多其他的应用我们还没有讲解。

程序名 作用 特别说明
mysqld MySQL 服务器守护进程 客户端程序需依赖其运行,负责处理数据库请求
mysql MySQL 命令行客户端 日常最常用工具,支持交互式 SQL 输入或批量执行 SQL 脚本
mysqlcheck 表维护客户端 用于检查、修复、分析和优化数据库表
mysqldump 数据库逻辑备份客户端 导出数据库/表结构及数据到 SQL、文本或 XML 文件
mysqlimport 数据导入客户端 将文本文件(如 CSV)数据导入表,封装 LOAD DATA INFILE
mysqladmin 管理操作客户端 执行创建/删除数据库、重载权限表等任务,可检索服务器版本、进程和状态信息
mysqlshow 信息显示客户端 展示数据库、表、列和索引的结构信息
mysqldumpslow 慢查询日志分析工具 解析慢查询日志,汇总性能问题
mysqlbinlog 二进制日志处理工具 读取二进制日志文件并输出 SQL 语句,用于数据恢复和主从复制
mysqlslap 负载模拟与基准测试工具 模拟多客户端并发访问,测试性能并报告响应时间

现在我们就来简单的讲解一下这些程序

在命令行中使用MySQL发行版中的其他工具时,一些选项是公共的,比如用户名和密码,使用方法和 mysql相同,在这里统一列出,后面我们在介绍不同的工具时,只讨论个性的选项及作用公共选项 如下所示:

选项-长格式 短格式 说明
--host=host_name -h host_name 连接到指定主机上的MySQL服务
--port=port_num -P port_num TCP/IP连接使用的端口号
--user=user_name -u user_name 用于连接到MySQL服务器的用户名
--password[=password] -p[password] 用于连接到MySQL服务器的密码。可选,如果没有给出,会提示用户输入
--defaults-file=file_name 使用指定的选项文件。如果该文件不存在,则会发生错误。
--compress -C 如果可能,压缩客户端和服务器之间传输的所有信息
--protocol={TCP|SOCKET|PIPE|MEMORY} 用于连接到服务器的传输协议, 默认为TCP
--version -V 显示版本信息并退出。
--help -?

一. mysqlcheck——表维护程序

mysqlcheck 是 MySQL 官方提供的在线表维护工具,用于检查、修复、优化或分析数据库表(无需停服)。

 1.1.作用

mysqlcheck客户端用于执行表维护,可以对表进行:分析、检查、优化或修复操作。

  • 分析的作用是查看表的关键字分布,能够让sql生成正确的执行计划(支持InnoDB,MyISAM, NDB)
  • 检查的作用是检查表的完整性以及数据库表和索引是否损坏(支持InnoDB,MyISAM, ARCHIVE,CSV)
  • 优化的作用是回收空间、减少碎片、提高I/O(支持InnoDB,MyISAM,ARCHIVE)
  • 修复的作用是修复可能已经损坏的表(支持MyISAM,ARCHIVE,CSV)

1.2 注意事项

  1. 当使用mysqlcheck工具时,MySQL服务器必须在运行状态
  2. 执行过程中相应的表将会被锁定,所以其他的操作将会被挂起
  3. 并不是所有的存储引擎都支持以上四种操作,如果遇到不支持的引擎会报出相应的错误
  4. 执行表修复操作之前对表进行备份,在某些情况下可能会导致数据丢失。

1.3 使用方法

一般通过以下三种方法使用mysqlcheck

  1. mysqlcheck [选项] db_name [tbl_name ...]
  2. mysqlcheck [options] --databases db_name ...
  3. mysqlcheck [options] --all-databases

如果在db_name后没有指定任何表名,那么整个数据库所有的表都会被检查

如果使用 --databases 或--all-databases 选项,那么整个数据库所有的表都会被检查

1.4 常用选项

mysqlcheck有如下常用选项,可以在命令行中指定,也可以在选项文件中通过 [mysqlcheck] [client]组进行指定

选项(注意前面是长选项,后面是短选项) 说明
--analyze,-a 分析表
--auto-repair 如果检查的表有损坏,则自动修复它。所有表都检查过之后才进行必要的修复
--check,-c 检查表中的错误。mysqlcheck的默认操作
--check-only-changed,-C 仅检查自上次检查以来更改过的表
--databases,-B --databases db_name多数据用空格隔开。处理指定数据库中的所有表
--force,-f 即使发生SQL错误也要继续
--optimize,-o 优化表
--repair,-r 执行可能进行的任务修复操作,除了唯一键
--skip-database --skip-database=db_name不需要执行检查的数据库名(区分大小写)
--tables

--tables=table_name多个表用格隔开。

在选项之后的所有名称参数都被视为表名。

--use-frm 对于MyISAM表的修复操作

最常用的就是 

  1. -a
  2. -c
  3. -o
  4. -r

这四个选项。而这四个也刚好是我们开头说的

mysqlcheck客户端用于执行表维护,可以对表进行:分析、检查、优化或修复操作。

  • 分析的作用是查看表的关键字分布,能够让sql生成正确的执行计划(支持InnoDB,MyISAM, NDB)——对应-a选项
  • 检查的作用是检查表的完整性以及数据库表和索引是否损坏(支持InnoDB,MyISAM, ARCHIVE,CSV)——对应-c选项
  • 优化的作用是回收空间、减少碎片、提高I/O(支持InnoDB,MyISAM,ARCHIVE)——对应-o选项
  • 修复的作用是修复可能已经损坏的表(支持MyISAM,ARCHIVE,CSV)——对应-r选项

我们来使用一下这些东西

首先看看我们的数据库是啥样子的 

 

接着我们就来分析一下这个表(-a选项)

都是没有问题的,接着我们检查表中的错误。(-c选项)

接着我们进行修复操作(-r选项)

你有没有发现报错了。这是因为我们的mysql默认存储引擎就是InnoDB存储引擎,而InnoDB存储引擎不支持这个修复操作。如果要修复InnoDB存储引擎的数据,则要把InnoDB存储引擎的表转换成Mylsam存储引擎。

接下来我们来优化一下。

InnoDB存储引擎在优化的过程中,其实是执行了一个重建的操作,官网建议我们不要经常去优化操作。

1.5 mysqlcheck的特殊使用

mysqlcheck程序的默认功能是对数据表进行检查操作(相当于指定选项--check),如果想要对表进行修复操作,可以通过复制原来的mysqlcheck程序,并重命名为mysqlrepair,并运行mysqlrepair即可,还可以创建mysqlcheck的快捷方式,并把快捷方式命名为mysqlrepair,然后直接运行,这时就执行的是修复操作,通过下表所示的命名方式可以改变mysqlcheck的默认行为:

程序名 说明
mysqlrepair 默认行为是修复,相当于选项 --repair
mysqlanalyze 默认行为是分析,相当于分析 --analyze
mysqloptimize 默认行为是优化,相当于优化 --optimize

 这个功能可以这样理解,就像给你的工具箱里的同一个多功能工具贴上不同的标签:

  1. 核心工具是 mysqlcheck 想象 mysqlcheck 本身是一个瑞士军刀。

    • 它默认的功能是“检查”表(--check),就像你拿出瑞士军刀默认可能想用小刀割东西。

    • 但它还有很多其他功能(修复 --repair, 分析 --analyze, 优化 --optimize),就像瑞士军刀还有剪刀、螺丝刀、开瓶器一样。

  2. 改名就是贴标签换默认功能: 系统做了一个很聪明的设计:

    • 当你把这个程序 复制一份并改名 (比如改成 mysqlrepair) 或者 创建一个快捷方式并改名 (比如快捷方式叫 mysqlrepair)。

    • 然后,当你运行 mysqlrepair 这个新名字时,程序内部会“看”一下自己现在叫什么名字。

    • 如果它发现自己叫 mysqlrepair,它就自动认为你想做的是“修复”操作 (--repair),而不是默认的检查。这就相当于你给瑞士军刀的“螺丝刀”功能单独贴了个“螺丝刀”标签,你拿起这个贴着“螺丝刀”标签的工具,默认就知道要用螺丝刀功能了。

  3. 总结改名后的默认行为:

    • 运行 mysqlrepair 程序看到自己叫 repair,就自动执行 --repair (修复表)。

    • 运行 mysqlanalyze 程序看到自己叫 analyze,就自动执行 --analyze (分析表,更新统计信息)。

    • 运行 mysqloptimize 程序看到自己叫 optimize,就自动执行 --optimize (优化表,整理碎片)。

二. mysqldump——数据库备份程序

2.1.作用

mysqldump 是 MySQL 官方提供的逻辑备份工具。它的核心工作原理可以概括为:连接到 MySQL 服务器,读取数据库的结构和数据,并将其转换成一系列标准的 SQL 语句,然后输出到一个文本文件(即备份文件)中,从而实现对数据库的简单备份。

mysqldump命令可以生成CSV、或XML格式的文件。

2.2 注意事项

  1. 转储表时必须要有 SELECT 权限
  2. 转储视图时必须要有 SHOW VIEW 权限
  3. 转储触发器时必须要有 TRIGGER 权限
  4. 如果没有使用 --single-transaction 选项时必须要有 LOCK TABLES 权限
  5. 如果没有使用 --no-tablespaces 选项时必须要有 PROCESS 权限
  6. 重新导入转储文件时,也需要有相应的权限
  7. 由于mysqldump是逐行转储数据,所以不适用于大数据量的转储与导入

2.3 使用方法

mysqldump的方法通常有以下使用,可以转储一个或多个表或数据库,如下所示:

  1. mysqldump [options] db_name [tbl_name ...]
  2. mysqldump [options] --databases db_name ...
  3. mysqldump [options] --all-databases

如果在db_name后没有指定任何表名,那么整个数据库所有的表都会被转储

如果使用 --databases 或--all-databases 选项,那么整个数据库所有的表都会被转储

2.4 常用选项

mysqldump有如下常用选项,可以在命令行中指定,也可以在选项文件中通过 [mysqldump] 和 [client] 组进行指定

选项 说明
--add-drop-database 在每个 CREATE DATABASE 语句之前添加 DROP DATABASE 语句
--add-drop-table 在每个 CREATE TABLE 语句之前添加 DROP TABLE 语句
--add-drop-trigger 在每个 CREATE TRIGGER 语句之前添加 DROP TRIGGER 语句
--add-locks 用 LOCK TABLES 和 UNLOCK TABLES 语句包裹每个表转储
--all-databases, -A 转储所有数据库中的所有表
--databases, -B --databases=db_name 多个数据库名用空格隔开,将参数解释为数据库名称并转储所有的表
--comments, -i 添加注释到转储文件
--compact 紧凑格式输出
--compatible=ansi 生成与其他数据库或旧MySQL服务器更兼容的输出
--complete-insert, -c 使用包含列名的完整INSERT语句
--events, -E 从转储数据库中转储事件
--extended-insert, -e 使用多行INSERT语法
--flush-logs, -F 在开始转储前刷新日志
--flush-privileges 在转储后刷新权限
--force, -f 转储期间发生了SQL错误,也要继续
--hex-blob 使用十六进制表示法转储二进制列
--ignore-table --ignore-table=db_name.table_name 多个表用空格隔开 不转储给定的表
--lock-all-tables, -x 锁定所有数据库中的所有表
--lock-tables, -l 在转储之前锁定指定要转储的表
--no-autocommit 将每个转储表的 INSERT 语句包含在 SET autocommit = 0 和 COMMIT 语句中
--no-create-db, -n 不要生成 CREATE DATABASE 语句
--no-create-info, -t 不要为每个转储的表生成 CREATE TABLE 语句
--no-data, -d 不转储表内容
--skip-add-drop-table 在每个 CREATE TABLE 语句之前不添加 DROP TABLE 语句
--skip-add-locks 不要添加锁
--skip-comments 转储文件中不添加注释
--skip-compact 不使用紧凑格式
--skip-triggers 不转储触发器
--tables --tables=table_name 多个表名用空格隔开 在选项之后的所有名称参数都被视为表名。
--triggers 转储每个表中的触发器
--xml, -X 以XML格式输出

接下来我们来实操一下


  • 实例一

先来实现一下最简单的东西。

接下来我们在命令行里面执行下面这个就行

mysqldump db2 > /home/zs_108/dump.sql -u root -p

这个命令的意思是:使用`root`用户(需要输入密码)来备份名为`db2`的数据库,并将备份的内容保存到`/home/zs_108/dump.sql`文件中。

我们打开这个文件看看

 

有没有发现核心的东西就是 创建表tb1,然后往里面插入信息。


  • 实例二

我们还是先看这个原有数据库是啥样

接着我们在命令行里面执行下面这个命令

mysqldump --add-drop-database -d scott > /home/zs_108/dump1.sql -u root -p

这个命令用 root 账户备份 scott 数据库的纯结构(不含数据),并在备份文件中自动添加删除数据库的命令,保存到 /home/zs_108/dump1.sql 文件,执行时会提示输入密码。 

我们打开看看

 

三. mysqladmin——MySQL 服务器管理程序

3.1.作用

mysqladmin是一个执行管理操作的客户端。可以用来检查服务器的配置和当前状态,以及创建和删除数据库等。

核心功能涵盖以下关键领域:

  1. 服务器启停控制:

    • shutdown安全关闭正在运行的 MySQL 服务器。

    • start slave / stop slave (旧版本):控制主从复制(较新版本推荐在 SQL 会话中使用 START REPLICA/STOP REPLICA)。

    • kill终止指定的客户端连接线程。

  2. 服务器状态监控与诊断:

    • ping快速检查 MySQL 服务器是否处于运行状态。

    • status:显示服务器关键状态摘要(运行时长、线程、查询、流量等)。

    • extended-status:显示所有服务器状态变量 (SHOW GLOBAL STATUS)。

    • variables:显示服务器系统变量 (SHOW GLOBAL VARIABLES)。

    • processlist:显示当前活动连接和查询列表 (SHOW PROCESSLIST)。

    • version:显示服务器版本信息

  3. 配置与维护操作:

    • reload / refresh刷新权限表(使 GRANT/REVOKE 立即生效)并重新打开日志文件

    • flush-*:刷新特定组件,如 flush-hosts(清除主机缓存)、flush-logs(轮换日志文件)、flush-privileges(同 reload)、flush-status(重置状态计数器)、flush-tables(关闭所有打开的表)、flush-threads(清空线程缓存)。

    • password更改指定用户的密码(需谨慎使用,密码可能暴露在命令行历史或进程列表中)。

  4. 数据库操作:

    • create创建一个新数据库。

    • drop删除一个数据库(及其所有表!需极度谨慎!)。

既然这是一个管理的应用,那说明配合mysqladmin的用户必须具备管理员权限。

3.2 使用方法

mysqladmin 可以使用以下语法:

mysqladmin [选项] 命令 [命令参数] [command [command-arg]]...

3.3 支持的命令

 语法中的command表示命令,有些命令后面需要跟上一个参数,如下列出了mysqladmin的常用命令:


  • version:显示来自服务器的版本信息。

我们执行下面这个命令

​​mysqladmin version -u root -p

 这些都是啥意思呢?

  • Uptime:MySQL 服务器已运行的秒数。
  • Threads:活动线程(客户端)的数量。
  • Questions:自服务器启动以来客户端的问题(查询)数。
  • Slow queries:慢SQL的查询数。
  • Opens:服务器已打开的表数。
  • Flush tables:服务器已执行flush-*、refresh和reload命令的数量。
  • Open tables:当前打开的表数。

  • status:显示简短的服务器状态消息。

我们执行下面这个命令

mysqladmin status -u root -p

 这个内容比那个version少很多了。


  • create db_name创建一个数据库名为 db_name 。

创建数据库时使用的是编码集是选项文件中配置的编码集,如果没有指定,那么使用和当前MYSQL版本默认的编码集

我们可以看看,我们现在是没有这个test数据库的

mysqladmin create test -u root -p

我们发现,这就多了一个test!!


  • drop db_name:删除名为 db_name 的数据库及其所有表。

我们现在就把上面创建的那个数据库test删除掉

我们执行下面这个命令

mysqladmin drop test -u root -p

这个时候我们输入y即可

这个时候我们回去看

发现那个test数据库没了。


    • password new_password:设置新密码。

    如果密码中有空格必须用双引号把密码包裹起来。

    password 后可以省略新密码,mysqladmin会在之后提示输入新密码。

    password 做为最后一个command时才可以省略密码值,否则下一个参数将作为密码被设置。

    Warning:有可能存在安全问题。

    Setting a password using mysqladmin should be considered insecure. On some systems, your password becomes visible to system status programs such as ps that may be invoked by other users to display command lines. MySQL clients typically overwrite the command-line password argument with zeros during their initialization sequence. However, there is still a brief interval during which the value is visible. Also, on some systems this overwriting strategy is ineffective and the password remains visible to ps. (SystemV Unix systems and perhaps others are subject to this problem.)


    • processlist:显示活动服务器线程的列表。

    我们输入下面这个命令看看

    mysqladmin processlist -u root -p

     嗯?这里怎么有两个root用户啊?因为我开了一个mysql客户端

    这两个root其实一个是mysql一个,mysqladmin一个

    1518是mysql的,1546是mysqladmin的

    不信的话,我们可以试试看,我们在mysql客户端随便输入一个SQL语句

    有没有发现这个1518的Time从333变成了8啊!!!


    • kill id , id ,...:终止服务器线程。如果给出了多个线程ID值,则列表中不能有空格。

     默认的mysql服务器可以维护150个活动连接。如果连接被用完了,可以使用kill指定去手动释放休眠时间最长的那个连接线程

    我们看上面那个图

    我们要杀掉这个id是1518的线程——这个其实就是我们的mysql客户端。

    我们执行下面这个命令

    mysqladmin kill 1518 -u root -p

    这个时候我们回到我们的mysql客户端。

    我们发现还是没有断开连接的提示,我们看看能不能执行命令。

    我们看它说它和服务端断开连接了,开始自动重连了。


     还有下面这些,我不在演示了 

    • reload:重新加载授权表。
    • refresh:刷新所有表。
    • shutdown:停止服务器。
    • start-replica:在副本服务器上开始复制。MySQL 8.0.26及以后的版本使用此命令。
    • start-slave:在副本服务器上开始复制。MySQL 8.0.26之前使用此命令。
    • stop-replica:停止副本服务器上的复制。MySQL 8.0.26及以后的版本使用此命令。
    • stop-slave:停止副本服务器上的复制。MySQL 8.0.26之前使用此命令。
    • variables:显示服务器系统变量及其值。
    • extended-status:显示服务器状态变量的值。
    • flush-hosts:刷新主机缓存中的所有信息。
    • flush-logs [log_type ...]:刷新所有日志。 log_type 中可以提供以下一种或多种日志类型:binary, engine, error, general, relay, slow,多个类型之间用空格分隔。
    • flush-privileges:重新加载授权表。
    • flush-status:清除状态变量。
    • flush-tables:刷新所有表。
    • flush-threads:刷新线程缓存。
    • ping:检查服务器是否可用。

    3.4 常用选项

    mysqladmin的常用选项参考公共选项部分,可以在命令行中指定,也可以在选项文件中通过 [mysqladmin] 和 [client] 组进行指定。

    选项-长格式 短格式 说明
    --host=host_name -h host_name 连接到指定主机上的MySQL服务
    --port=port_num -P port_num TCP/IP连接使用的端口号
    --user=user_name -u user_name 用于连接到MySQL服务器的用户名
    --password[=password] -p[password] 用于连接到MySQL服务器的密码。可选,如果没有给出,会提示用户输入
    --defaults-file=file_name 使用指定的选项文件。如果该文件不存在,则会发生错误。
    --compress -C 如果可能,压缩客户端和服务器之间传输的所有信息
    --protocol={TCP|SOCKET|PIPE|MEMORY} 用于连接到服务器的传输协议, 默认为TCP
    --version -V 显示版本信息并退出。
    --help -?

    四.mysqlshow——显⽰数据库、表和列信息

    4.1.作用

    mysqlshow 是 MySQL 官方提供的一个命令行工具,主要用于快速查看 MySQL 服务器中的数据库、表、列(字段)的结构信息

    它提供了一种比登录到 mysql 命令行客户端并执行 SHOW 语句更快捷、更直观的方式来浏览数据库的元数据(metadata)。

    4.2.注意事项

    mysqlshow为一些show语句提供了一个命令行接口。我们可以去官网看看:MySQL :: MySQL 8.0 Reference Manual :: 6.5.7 mysqlshow — Display Database, Table, and Column Information

    4.3.使用方法

    mysqlshow可以使⽤以下语法:

     mysqlshow [options] [db_name [tbl_name [col_name]]]
    • db_name tbl_name col_name 可以使⽤通配符 * 、 ? 、 % 或 _
    • 如果没有指定数据库,则显⽰所有数据库名称列表。
    • 如果没有指定表,则显⽰数据库中所有匹配的表。
    • 如果没有指定列,则显⽰表中所有匹配的列和列类型。
    • 输出仅显⽰当前权限可以访问的数据库、表或列的名称。

    它的主要功能和用途如下:

    查看数据库列表:

    mysqlshow -u 用户名 -p

    输入密码后,会列出 MySQL 服务器上用户有权访问的所有数据库(相当于 SHOW DATABASES;)。

    查看某个数据库中的所有表:

    mysqlshow -u 用户名 -p 数据库名

    这会列出指定数据库中的所有表(相当于 USE 数据库名; SHOW TABLES;)。

    查看某个表的列(字段)信息:

    mysqlshow -u 用户名 -p 数据库名 表名

    这会显示指定表的列名、数据类型、是否允许 NULL、键信息(主键等)、默认值等(相当于 DESCRIBE 表名; 或 SHOW COLUMNS FROM 表名;)。

    我们还可以指定列

     

    查看更详细的表状态信息:

    mysqlshow -u 用户名 -p --status 数据库名 表名

    使用 --status (或 -i) 选项会显示类似 SHOW TABLE STATUS LIKE '表名'; 的结果,包含更多信息,如存储引擎、行数、平均行长度、数据大小、索引大小、创建时间等。

    查看表索引信息:

    mysqlshow -u 用户名 -p --keys 数据库名 表名

    使用 --keys (或 -k) 选项会显示表的索引信息(相当于 SHOW INDEX FROM 表名;)。

    查看表的主键信息:

    mysqlshow -u 用户名 -p --primary-keys 数据库名 表名

    4.4.常用选项

    mysqlshow的常⽤选项参考公共选项部分,可以在命令⾏中指定,也可以在选项⽂件中通过 [mysqlshow] 和 [client] 组进⾏指定,具体选项参考公共选项列表。

    选项-长格式 短格式 说明
    --host=host_name -h host_name 连接到指定主机上的MySQL服务
    --port=port_num -P port_num TCP/IP连接使用的端口号
    --user=user_name -u user_name 用于连接到MySQL服务器的用户名
    --password[=password] -p[password] 用于连接到MySQL服务器的密码。可选,如果没有给出,会提示用户输入
    --defaults-file=file_name 使用指定的选项文件。如果该文件不存在,则会发生错误。
    --compress -C 如果可能,压缩客户端和服务器之间传输的所有信息
    --protocol={TCP|SOCKET|PIPE|MEMORY} 用于连接到服务器的传输协议, 默认为TCP
    --version -V 显示版本信息并退出。
    --help -?

    五.mysqldumpslow - 总结慢查询日志文件

    5.1 作用

    mysqldumpslow 是 MySQL 官方提供的一个命令行工具,专门用于解析、汇总和分析 MySQL 的慢查询日志文件。它的核心功能是帮助数据库管理员(DBA)和开发者快速识别数据库中执行缓慢的 SQL 语句,以便进行性能优化。

            在平时使用MySQL数据库时,经常进行查询操作,有些查询语句执行的时间非常长,当执行时间超过设定的阈值时,我们称这个查询为慢查询,慢查询的相关信息通常需要用日志记录下来称为慢查询日志mysqldumpslow可以解析慢查询日志文件并汇总其内容,有关慢查询日志的内容我们在MySQL服务器配置与管理专题进行讲解。

            这个是进行慢查询对应的SQL优化的依据。


    我们回忆一下

    mysqladmin status -u root -p

    Slow queries:慢SQL的查询数。

    这个Slow queries就是我们慢查询的字段。目前是0,因为我们当前数据库没有涉及大查询的字段。

    我们来看看这个慢查询的阈值

    show variables like '%query%';

     这个long_query_time就是我们说的慢查询的阈值。如果一个查询的时间大于10s,那么就会被系统标记为慢查询,存放到慢查询日志里面,然后我们就能查询到这个慢查询。

    然后我们说的慢查询日志文件在哪里?

    其实就在下面

    /var/lib/mysql/lavm-kpx2y2i6go-slow.log就是我们说的慢查询日志文件。

    其实系统如果出现慢查询,系统会自动存储到慢查询日志文件里面,这是有前提的——就是我们下面这个字段必须是开的(也就是on)

    5.2 注意事项

    通常情况下,mysqldumpslow会将相似的查询分组并显示摘要输出,一般会把数字和字符串用"N"和"S"代替,要想显示真实的值可以使用-a和-n选项。

    怎么理解呢?

    慢查询日志中会有大量结构相同但参数不同的查询:

    SELECT * FROM users WHERE id = 100;
    SELECT * FROM users WHERE id = 200;

    抽象化将这些查询视为同一类查询,便于统计执行次数、总耗时等关键指标。

    抽象化后就变成了

    SELECT * FROM users WHERE id = N;

    转换规则就是 

    • 数字 → N (例如 100200 都变成 N)

    • 字符串 → 'S' (例如 'Phone''Laptop' 都变成 'S')

    就像下面这样子

    -- 原始查询 --
    SELECT * FROM orders WHERE amount > 100 AND status = 'pending';
    
    -- 抽象化后 --
    SELECT * FROM orders WHERE amount > N AND status = 'S';

     事实上,如果我们想显示真实的值,我们就可以借助-a或者-n选项


    • 1. -a 选项 (不抽象化)
    mysqldumpslow -a slow.log

    效果:禁用所有抽象化,显示原始SQL

    输出示例

    Count: 5  Time=2.1s (10.5s) ...
      SELECT * FROM users WHERE id = 100 AND email = 'alice@example.com'
    
    Count: 3  Time=1.8s (5.4s) ...
      SELECT * FROM users WHERE id = 200 AND email = 'bob@example.com'

    缺点相同结构的查询会被分成不同组,失去统计意义


    • 2. -n 选项 (控制数字抽象化)
    mysqldumpslow -n 20 slow.log
    • 功能:设置数字抽象化的敏感度

    • 参数:数字位数阈值(默认为-n 128

    -n 选项不显示真实数字,而是控制数字的抽象化粒度

    当您使用 -n N 选项时(如 -n 2):

    1. 不是显示真实数字

    2. 而是根据数字位数决定抽象化方式:

      • 数字位数  N → 用单个 # 符号表示

      • 数字位数 > N → 用 N 表示

    示例解析

    -- 原始查询 --
    SELECT * FROM logs WHERE error_code = 5;     -- 1位数
    SELECT * FROM logs WHERE error_code = 42;    -- 2位数
    SELECT * FROM logs WHERE user_id = 10025;    -- 5位数
    
    -- 使用 mysqldumpslow -n 2 的输出 --
    SELECT * FROM logs WHERE error_code = #;     -- 1位变#
    SELECT * FROM logs WHERE error_code = #;     -- 2位变#
    SELECT * FROM logs WHERE user_id = N;        -- 5位>2,变N

    5.3 使用方法

    由于我们这没有慢查询SQL,所以我们借助一下官网的信息:MySQL :: MySQL 8.0 参考手册 :: 6.6.10 mysqldumpslow — 总结慢查询日志文件

    mysqldumpslow可以使用以下语法

    mysqldumpslow [options] [log_file ...]

    在没有给出任何选项的输出如下:

    Reading mysql slow query log from /usr/local/mysql/data/mysqld80-slow.log
    Count: 1  Time=4.32s (4s)  Lock=0.00s (0s)  Rows=0.0 (0), root[root]@localhost
     insert into t2 select * from t1
    
    Count: 3  Time=2.53s (7s)  Lock=0.00s (0s)  Rows=0.0 (0), root[root]@localhost
     insert into t2 select * from t1 limit N
    
    Count: 3  Time=2.13s (6s)  Lock=0.00s (0s)  Rows=0.0 (0), root[root]@localhost
     insert into t1 select * from t1

    那这些字段都啥意思呢?我们看看 

    1. Count

    • 含义:该查询在日志中出现的次数。

    • 示例Count: 1 表示这条查询只出现了一次;Count: 3 表示这条查询重复出现了 3 次。

    • 作用:帮助您快速定位高频慢查询。

    2. Time

    • 格式Time=平均执行时间 (总执行时间)

    • 示例

      • Time=4.32s (4s):平均每次执行耗时 4.32 秒,总耗时 4 秒(因为 Count=1)。

      • Time=2.53s (7s):平均每次执行耗时 2.53 秒,总耗时 7 秒(因为 Count=3,3×2.53≈7.59,但日志可能四舍五入)。

    • 作用:衡量查询性能的核心指标,值越大表示查询越慢。

    3. Lock

    • 格式Lock=平均锁等待时间 (总锁等待时间)

    • 示例Lock=0.00s (0s) 表示查询没有等待锁的开销。

    • 作用:反映查询是否因等待表锁或行锁而延迟。如果值较高,可能表示存在锁竞争。

    4. Rows

    • 格式Rows=平均影响的行数 (总影响的行数)

    • 示例Rows=0.0 (0) 表示查询没有返回或修改任何行。

    • 作用

      • 对于 SELECT 查询:表示返回的行数。

      • 对于 INSERT/UPDATE/DELETE:表示修改的行数。

      • 值为 0 可能表示:

        • 查询是 INSERT ... SELECT 且目标表为空。

        • 查询是 INSERT INTO t1 SELECT * FROM t1(自插入,但未实际新增数据)。

        • 查询条件未匹配到任何行。

    5. 用户信息

    • 格式用户[认证用户]@主机

    • 示例root[root]@localhost 表示:

      • 执行查询的数据库用户:root

      • 认证用户:root(可能通过代理或权限链)。

      • 连接来源:localhost(本地连接)。

    • 作用:帮助定位问题查询的来源(用户和主机)。

    6. 查询语句

    • 示例

      • insert into t2 select * from t1

      • insert into t2 select * from t1 limit N

      • insert into t1 select * from t1

    • 作用:实际执行的 SQL 语句,是分析性能问题的核心依据。

    5.4.常用选项

    选项 说明
    -a 不将数字(Numbers)和字符串(Strings)替换为 N 和 S
    -n N 在查询名称中,若包含超过 N 个数字,则用 N 代替
    -g pattern 仅分析匹配指定模式(Pattern)的慢查询
    --help 显示帮助信息并退出
    -h host_name 指定 MySQL 服务器主机名(支持通配符),默认匹配所有主机(*
    -i name 指定服务器实例名称
    -l 不从总时间中减去锁占用时间
    -r 按倒序排列结果
    -s sort_type 指定排序方式(sort_type 可选值见下文)
    -t N 仅显示前 N 个查询结果
    --verbose-v 输出更详细的程序运行信息
    • -s sort_type里的sort_type的可选值说明:
    排序类型 描述 示例 典型使用场景
    t 按查询总时间(Total Time)排序 -s t 定位总耗时最长的查询,适合分析整体性能瓶颈
    at 按平均查询时间(Average Time)排序 -s at 识别单次执行较慢的查询,适合优化高频但单次耗时高的操作
    l 按锁占用总时间(Total Lock Time)排序 -s l 分析锁竞争严重的查询,适合排查并发性能问题
    al 按平均锁占用时间(Average Lock Time)排序 -s al 识别单次锁持有时间较长的查询,适合优化锁粒度或减少锁竞争
    r 按发送的总行数(Total Rows Sent)排序 -s r 定位返回数据量最大的查询,适合优化大数据量返回的场景(如未分页的列表查询)
    ar 按平均发送的行数(Average Rows Sent)排序 -s ar 识别单次返回数据量较大的查询,适合优化高频但单次数据量大的操作
    c 按查询计数(Count)排序 -s c 统计执行次数最多的查询,适合定位高频次执行的轻量级操作(如频繁的缓存查询)

    六. mysqlbinlog——处理二进制日志文件

    • 什么是二进制日志文件

    我们平时对数据库的修改,包括对数据的增删改,都会被描述成一个"事件",每个"事件"都会以二进制的形式记录在一个文件里,这个文件就是服务器的二进制日志文件,称为Binary Log或binlog。

    关于二进制日志文件的具体格式与使用场景我们在MySQL主从复制专题讲解

    我们可以简单的讲讲MySQL主从复制啊

    • 一、主从复制是什么?

    主从复制是MySQL的一种数据同步技术,就像一个“主仓库”负责记录所有数据变动,然后自动同步到多个“备份仓库”,确保数据一致性和系统稳定性。

    • 二、工作原理:三步走
    1. 主库记录变更
      主库将所有写操作(如增删改)记录到二进制日志(binlog)中,就像“记账本”一样。

      • 例如:用户下单、修改订单等操作都会被记录。

    2. 从库拉取日志
      从库会定时通过I/O线程连接主库,拉取binlog并保存到本地的中继日志(relay log)。

      • 就像分店经理每天来取总账本的副本。

    3. 从库执行变更
      从库的SQL线程读取relay log,解析其中的SQL语句并执行,使数据与主库保持一致。

      • 就像分店会计根据副本重新录入订单。

    • 三、生活化例子

    假设你是一家连锁餐厅的老板(主库),每天记录所有订单(数据变更)。分店(从库)需要同步这些订单信息:

    • 主库:在总账本(binlog)上记录每一笔订单。

    • 从库:分店经理(I/O线程)每天结束时来取总账本的副本(拉取binlog)。

    • 执行同步:分店会计(SQL线程)根据副本重新录入订单(执行SQL),确保分店账本与总店一致。

    6.1 作用

    mysqlbinlog能够以文本格式显示二进制日志文件中的内容。

    6.2 注意事项

    • 数据目录在哪里?

    我们可以去

    cd /etc/mysql/mysql.conf.d
    ls -l

    我们可以看看这个mysqld.cnf里面的东西

    这个datadir就是我们口中的数据目录。


    binlog的默认保存路径是数据目录:

    • Linux下默认目录:/var/lib/mysql
    • Windows下默认目录:C:\ProgramData\MySQL\MySQL Server 8.0\Data

     binlog是以.00000n结尾命名的文件,n不断递增

    6.3 使用方法

    mysqlbinlog可以使用以下语法

    mysqlbinlog [options] log_file ...

    例如要显示名为binlog.000001二进制日志文件的内容,可以使用以下命令:

    mysqlbinlog binlog.000001

    这说明出问题了,我们得去

    vim /etc/mysql/my.cnf

     

    然后我们接着运行,我们发现还是很奇怪的东西

     这些看起来乱七八糟的。 

    我们就不看了,我们还是举一个片段来吧

    root@guangchen-vm:/var/lib/mysql# mysqlbinlog binlog.000010
     # ... 
    略
    # at 37380
     #230906 15:30:33 server id 1  end_log_pos 37442 CRC32 0x6d3de7e6         
    Write_rows: table id 119 flags: STMT_END_F
     BINLOG '
     mSr4ZBMBAAAAQgAAAASSAAAAAHcAAAAAAAEAB3Rlc3RfZGIAB3N0dWRlbnQABAMDDw8EUABQAA8B
     AQACAS1oGW+U
     mSr4ZB4BAAAAPgAAAEKSAAAAAHcAAAAAAAMAAgAE/wAFAAAAVcMAAAbpkrHkuIMKcXFAYml0LmNv
     bebnPW0=
     '/*!*/;
     # ... 
    略

    1.# at 37380:事件在 binlog 文件中的起始位置(字节偏移量)。

    2. 时间戳 (#230906 15:30:33)

    • 通俗解释:这条日志记录的“时间”,就像日记本上的日期。这里表示操作发生在 2023 年 9 月 6 日 15 点 30 分 33 秒,帮助您定位问题发生的时间点。

    3. 服务器ID (server id 1)

    • 通俗解释:这是 MySQL 服务器的“身份证号”。如果有多台数据库服务器,每台都有一个唯一 ID(这里是 1),用于区分日志来源。

    4. 结束位置 (end_log_pos 37442)

    • 通俗解释:这是日志条目在二进制日志文件中的“页码”。表示这条日志内容结束在文件的 第 37442 字节位置,方便快速定位和查找。

    5. CRC32校验值 (CRC32 0x6d3de7e6)

    • 通俗解释:这是一个“数据指纹”,用于验证日志是否被篡改或损坏。如果计算出的指纹和 0x6d3de7e6 不一致,说明日志可能有问题。

    6. 操作类型 (Write_rows)

    • 通俗解释:这是日志记录的“动作类型”。Write_rows 表示这条日志记录了一次 写入数据 的操作(比如插入或更新数据)。

    7. 表ID (table id 119)

    • 通俗解释:这是被操作数据库表的“身份证号”。每个表在 MySQL 中都有一个唯一 ID(这里是 119),用于快速定位到具体的数据表。

    8. 标志 (flags: STMT_END_F)

    • 通俗解释:这是操作的“附加标签”。STMT_END_F 表示这是一个 语句结束的标志,类似于一句话的句号,帮助解析日志的结构。

    9. BINLOG内容

    • 通俗解释:这是日志的“核心数据”,包含了实际的操作细节(比如插入的字段和值)。但内容通常是加密或编码的字符串(如 mSr4ZBMBAAAAQgAAAASSAAAAAHcAAAAAAA...),需要专业工具才能解读。

    总结:这条日志说了什么?

    这条日志记录了 2023 年 9 月 6 日 15:30:33,服务器(ID=1)在二进制日志的 37442 字节位置 写入了一条操作:对表(ID=119)执行了写入数据的动作,并通过 CRC32 校验确保数据完整性。

    binlog.000010的输出内容中包含各种事件,事件信息包括SQL语句、执行语句的服务器ID、语句执行时的时间戳、花费的时间等等。

    日志的具体格式我们这里先不做讨论。

    6.4常用选项

    mysqlbinlog有如下常用选项,可以在命令行中指定,也可以在选项文件中通过 [mysqlbinlog] 和[client]组进行指定 

    选项 说明
    --base64-output --base64-output=value把BINLOG中的事件用base-64进行编码,value的取值在之后有特殊说明
    --binlog-row-event-max-size --binlog-row-event-max-size=N指定基于行的二进制日志事件的最大值(以字节为单位),取值应为256的倍数,默认4GB
    --force-if-open, -F 读取二进制日志文件,即使它们已打开或未正确关闭
    --force-read, -f 如果使用这个选项,当mysqlbinlog读取一个不能识别的binlog,会打印一个警告并忽略该事件,然后继续。如果没有这个选项,mysqlbinlog在读取这样的事件时会停止
    --hexdump, -H 显示日志的十六进制转储
    --offset, -o --offset=N, -o N:跳过日志中的前N条记录
    --raw mysqlbinlog以原始二进制格式写入事件,默认是文本格式
    --read-from-remote-server, -R --read-from-remote-server=file_name, -R读取远程MySQL服务器的二进制日志,而不是读取本地,要求远程服务器正在运行
    --require-row-format 基于行格式的二进制日志记录格式。
    --result-file, -r --result-file=name, -r name:输出的目标文件
    --server-id 仅显示指定服务器ID创建的事件。
    --server-id-bits --server-id-bits=N:使用server_id的前N位来标识服务器
    --start-datetime --start-datetime=datetime:从等于或晚于datetime的第一个事件开始读取日志,支持DATETIME和TIMESTAMP类型
    --start-position,-j 

    - --start-position=N,-j N

    开始读取日志的位置,position等于或大于N之后的任何事件。

    --stop-datetime

    --stop-datetime=datetime

    在等于或晚于datetime的第一个事件结束,支持 DATETIME 和TIMESTAMP类型

    --stop-never 保持与服务器的连接
    --stop-position --stop-position=N:在日志位置N处停止解码
    --verbose, -v 重新构建行事件并将其显示为已注释的SQL语句,并在适用的情况下显示表分区信息。

    --base64-output=value:控制BINLOG语句的显示方式,value可选值如下:

    参数选项 说明
    AUTO (默认值)在必要时自动显示BINLOG语句,是重新执行二进制日志文件内容时的唯一安全行为。
    UNSPEC 行为与AUTO相同,即未明确指定时的默认行为。
    NEVER 不显示BINLOG语句。
    DECODE-ROWS 不显示加密内容,可配合-verbose选项以注释形式显示事件的SQL语句(仅用于调试或测试)。

    我说实话,作为开发人员,这个mysqlbinlog很少用到,一般是运维什么的用的比较多。

    七.mysqlslap - 负载仿真客户端

    7.1 作用

    mysqlslap是一个诊断程序,用于模拟MySQL服务器的客户端负载,并报告每个阶段的时间,就好比多个客户端正在访问服务器一样。

    核心功能

    1. 模拟并发负载

      • 通过多线程模拟大量用户同时执行 SQL 操作。

      • 测试数据库在高并发下的响应速度和稳定性。

    2. 自动生成测试数据

      • 可自动创建测试表并填充随机数据。

      • 支持自定义表结构和数据量。

    3. 性能指标统计

      • 输出平均查询耗时、最小/最大耗时、并发吞吐量等指标。

      • 生成详细的压力测试报告。

    7.2 使用方法

    mysqlslap可以使用以下语法

     mysqlslap [options]

    7.3 注意事项

    1. 可以通过 --create 或 --query 选项,指定包含SQL语句的字符串或包含SQL语句的文件

    2. 如果指定一个包含SQL语句的文件,默认情况下每行必须包含一条语句(也就是说,隐式语句分隔符是换行符)

    3. 如果要把一条语句分为多行书写,可以使用 --delimiter 选项指定不同的分隔符

    4. 不能在文件中包含注释,因为mysqlslap不能解析注释。

    5. mysqlslap运行分为三个阶段:

    • a. 创建测试数据阶段:创建用于测试的库、表或数据,这个阶段使用单个客户端连接
    • b. 运行负载测试阶段,这个阶段可以使用许多客户端连接
    • c. 清理阶段:执行删除表,断开连接等操作,这个阶段使用单个客户端连接

    7.4.常用选项

    我们可以去官网看看:MySQL :: MySQL 8.0 Reference Manual :: 6.5.8 mysqlslap — A Load Emulation Client

    选项名称 说明
    --auto-generate-sql-a 当命令选项或文件中没有提供 SQL 语句时,自动生成 SQL 语句
    --auto-generate-sql-add-autoincrement 在自动生成的表中添加 AUTO_INCREMENT 列
    --auto-generate-sql-execute-number --auto-generate-sql-execute-number=N,指定要⾃动⽣成多少查询
    --auto-generate-sql-guid-primary 向自动生成的表添加基于 GUID 的主键
    --auto-generate-sql-load-type --auto-generate-sql-load-type=type
    指定测试负载类型。允许的值是 read (扫描表)、write (插入表)、key (读取主键)、update (更新主键) 或 mixed (一半插入,一半扫描选择)。默认为 mixed
    --auto-generate-sql-secondary-indexes --auto-generate-sql-secondary-indexes=N
    指定要向自动生成的表添加多少索引。默认为 0
    --auto-generate-sql-unique-query-number --auto-generate-sql-unique-query-number=N
    为自动测试生成多少个不同查询 (where 条件不同)。默认值是 10
    --auto-generate-sql-write-number --auto-generate-sql-write-number=N
    要执行多少行插入。默认值是 100
    --auto-generate-sql-unique-write-number --auto-generate-sql-unique-write-number=N
    为 --auto-generate-sql-write-number 生成多少个不同的查询。默认值是 10
    --commit --commit=N
    在提交之前要执行多少语句。默认值是 0
    --concurrency-c --concurrency=N-c N
    要模拟并行客户端的数量
    --create --create=value
    用于创建表的 SQL 语句或文件
    --create-schema --create-schema=value
    用于测试的库,测试完成后会自动删除
    --csv --csv[=file_name]
    以逗号分隔的格式输出到指定的文件,如果没有给出文件,则输出到控制台
    --delimiter-F --delimiter=str-F str
    SQL 语句的分隔符
    --engine-e --engine=engine_name-e engine_name
    创建表的存储引擎
    --iterations-i --iterations=N-i N
    每个客户端运行测试的次数
    --no-drop 运行完测试后不删除创建的数据库
    --number-char-cols-x --number-char-cols=N-x N
    使用 --auto-generate-sql 选项时 VARCHAR 列的数量
    --number-int-cols-y --number-int-cols=M-y M
    使用 --auto-generate-sql 选项时 INT 列的数量
    --number-of-queries --number-of-queries=M
    限制每个客户端最大的查询数
    --pre-query --pre-query=value
    测试开始前要执行 SQL 语句或 SQL 文件,不计入查询次数
    --pre-system --pre-system=str
    测试开始前使用 system() 执行的命令,不计入查询次数
    --post-query --post-query=value
    测试完成后要执行 SQL 语句或 SQL 文件,不计入查询次数
    --post-system --post-system=str
    测试完成后使用 system() 执行的命令,不计入查询次数
    --query-q --query=value-q value
    包含用于测试的 SELECT 语句的文件或 SQL 语句

    7.5.示例

    • 示例一——自定义语句 + 高并发测试

    下面这个命令使用 mysqlslap 工具模拟 50 个并发用户重复执行 200 次 "SELECT * FROM a" 查询,测试 MySQL 数据库的并发处理性能和查询响应能力。

    mysqlslap 
      --delimiter=";" 
      --create="CREATE TABLE a (b int); INSERT INTO a VALUES (23);" 
      --query="SELECT * FROM a" 
      --concurrency=50 
      --iterations=200 
      -uroot 
      -p
    参数 说明
    --delimiter=";" 指定 SQL 语句分隔符为分号 ;
    --create="CREATE TABLE a (b int); INSERT INTO a VALUES (23);" 测试前执行的操作:
    1. 创建测试表 a (包含整数列 b)
    2. 插入测试数据 23
    --query="SELECT * FROM a" 压力测试的核心操作:
    重复执行 SELECT * FROM a 查询
    --concurrency=50 模拟 50个并发用户 同时操作
    --iterations=200 整个测试过程 重复执行200次
    -uroot 使用 root 用户 连接数据库
    -p 连接时需要 输入密码

    测试流程

    1. 初始化阶段

      CREATE TABLE a (b int);  -- 创建测试表
      INSERT INTO a VALUES (23); -- 插入测试数据
    2. 压力测试阶段(重复200次):

      -- 每次模拟50个用户同时执行:
      SELECT * FROM a;  -- 执行简单查询
    3. 结果统计

      • 输出平均查询耗时

      • 统计最小/最大响应时间

      • 计算服务器吞吐量

    我们去运行一下看看

    mysqlslap --delimiter=";" --create="CREATE TABLE a (b int); INSERT INTO a VALUES (23);" --query="SELECT * FROM a" --concurrency=50 --iterations=200 -uroot -p

    执行后就下面这样子了。 

    过了一会,它就是会变成下面这样子

     我们看看这些字段啥意思

    字段 含义 说明
    Average number of seconds to run all queries: 0.018 seconds 平均总耗时 所有客户端完成全部查询的平均时间为 0.018 秒。反映数据库处理请求的典型速度。
    Minimum number of seconds to run all queries: 0.009 seconds 最短总耗时 某个客户端完成全部查询的最短时间为 0.009 秒。体现数据库在最佳状态下的极限性能。
    Maximum number of seconds to run all queries: 0.083 seconds 最长总耗时 某个客户端完成全部查询的最长时间为 0.083 秒。反映数据库在高负载或资源竞争时的性能波动。
    Number of clients running queries: 50 并发客户端数 模拟了 50 个客户端同时发起查询。用于测试数据库的并发处理能力。
    Average number of queries per client: 1 每客户端查询次数 每个客户端平均执行了 1 次查询。结合并发数可推算总查询量(50 × 1 = 50 次)。

    • 示例二——自动生成复杂表结构测试

    下面命令通过自动创建包含 2 个整型列和 3 个字符列的表,模拟 5 个并发用户执行 20 轮混合读写操作(插入/查询),测试 MySQL 的并发处理能力。

    mysqlslap --concurrency=5
              --iterations=20
              --number-int-cols=2
              --number-char-cols=3
              --auto-generate-sql -uroot -p
    参数 作用
    --concurrency=5 模拟 5 个并发用户 同时操作数据库
    --iterations=20 整个测试过程 重复执行 20 轮
    --number-int-cols=2 在自动生成的测试表中 创建 2 个整型列 (如 INT)
    --number-char-cols=3 在自动生成的测试表中 创建 3 个字符列 (如 VARCHAR)
    --auto-generate-sql 自动生成测试 SQL
    - 建表
    - 插入数据
    - 混合查询(默认 read/write 各半)
    -uroot -p 使用 root 用户登录(执行时会提示输入密码)

    我们去运行一下看看

    mysqlslap --concurrency=5 --iterations=20 --number-int-cols=2 --number-char-cols=3 --auto-generate-sql -uroot -p

     还是需要一点时间

     


    • 示例三——从文件加载 SQL 测试
    mysqlslap --concurrency=5
              --iterations=5 
              --query=query.sql 
              --create=create.sql 
              --delimiter=";" -uroot -p

     该命令使用 create.sql 文件中的 SQL 创建表结构,通过 query.sql 文件中的 SQL 执行测试,模拟 5 个并发用户重复执行 5 轮操作,评估 MySQL 数据库性能。

    参数 作用
    --concurrency=5 模拟 5 个并发用户 同时操作
    --iterations=5 整个测试过程 重复执行 5 轮
    --query=query.sql 核心测试 SQL
    从 query.sql 文件读取测试语句(如 SELECT/UPDATE)
    --create=create.sql 初始化 SQL
    从 create.sql 文件读取建表语句
    --delimiter=";" SQL 语句分隔符为 分号 ;
    (支持单文件多语句)
    -uroot -p 使用 root 用户登录(执行时需输入密码)

    测试流程:

    1. 初始化阶段
      执行 create.sql 中的 SQL(如建表):

      -- create.sql 示例
      CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(50));
      INSERT INTO users VALUES (1, 'Alice'), (2, 'Bob');
    2. 压力测试阶段
      每轮并发执行 query.sql 中的 SQL:

      -- query.sql 示例
      SELECT * FROM users WHERE id=1;  -- 查询1
      UPDATE users SET name='Charlie' WHERE id=2;  -- 更新1
    3. 执行规模

      5 并发用户 × 5 轮测试 = 共 25 个测试单元
      每个单元执行 query.sql 中所有 SQL


    网站公告

    今日签到

    点亮在社区的每一天
    去签到