文章目录
- 一、mysql
-
- [1. 核心特性](#1. 核心特性)
- [2. 核心表](#2. 核心表)
- [3. 权限管理说明](#3. 权限管理说明)
-
- [3.1. 权限层次结构](#3.1. 权限层次结构)
- [3.2. 权限类型](#3.2. 权限类型)
- [4. 常用操作](#4. 常用操作)
-
- [4.1. 查看所有用户](#4.1. 查看所有用户)
- [4.2. 授予权限](#4.2. 授予权限)
- [4.3. 查看特定用户的权限](#4.3. 查看特定用户的权限)
- [4.4. 修改权限](#4.4. 修改权限)
- [4.5. 删除用户权限](#4.5. 删除用户权限)
- [5. 常见问题](#5. 常见问题)
-
- [5.1. 无法登录](#5.1. 无法登录)
- [5.2. 权限不生效](#5.2. 权限不生效)
- [5.3. 密码重置](#5.3. 密码重置)
- 二、information_schema
-
- [1. 核心特性](#1. 核心特性)
- [2. 核心视图](#2. 核心视图)
- [3. 常用操作](#3. 常用操作)
-
- [3.1. 查询所有数据库](#3.1. 查询所有数据库)
- [3.2. 查询特定数据库的所有表](#3.2. 查询特定数据库的所有表)
- [3.3. 查询表结构](#3.3. 查询表结构)
- [3.4. 查询索引信息](#3.4. 查询索引信息)
- [3.5. 查询外键关系](#3.5. 查询外键关系)
- [3.6. 查询视图定义](#3.6. 查询视图定义)
- [3.7. 数据库结构比较](#3.7. 数据库结构比较)
- 三、performance_schema
-
- [1. 核心特性](#1. 核心特性)
- [2. 核心运行机制](#2. 核心运行机制)
- [3. 核心表](#3. 核心表)
- [4. 常用操作](#4. 常用操作)
-
- [4.1. 检查是否已启用](#4.1. 检查是否已启用)
- [4.2. 开启特定监控项](#4.2. 开启特定监控项)
- [4.3. 配置监控粒度](#4.3. 配置监控粒度)
- [4.4. 查看最耗时的SQL语句](#4.4. 查看最耗时的SQL语句)
- [4.5. 查看最近执行的SQL详情](#4.5. 查看最近执行的SQL详情)
- [4.6. 分析I/O瓶颈](#4.6. 分析I/O瓶颈)
- [4.7. 监控长期运行事务](#4.7. 监控长期运行事务)
- 四、sys
-
- [1. 核心特性](#1. 核心特性)
- [2. 主要内容](#2. 主要内容)
-
- [2.1. 视图(Views)](#2.1. 视图(Views))
- [2.2. 存储过程(Procedures)](#2.2. 存储过程(Procedures))
- [2.3. 函数(Functions)](#2.3. 函数(Functions))
- [3. 常用操作](#3. 常用操作)
-
- [3.1. 排查慢查询](#3.1. 排查慢查询)
- [3.2. 识别热点表](#3.2. 识别热点表)
- [3.3. 分析锁等待](#3.3. 分析锁等待)
- [3.4. 监控IO性能](#3.4. 监控IO性能)
- [3.5. 查看使用临时表的查询](#3.5. 查看使用临时表的查询)
- [3.6. 查看当前活动链接](#3.6. 查看当前活动链接)
- [3.7. 查看内存使用情况](#3.7. 查看内存使用情况)
- [3.8. 查看索引使用情况](#3.8. 查看索引使用情况)
MySQL自带的系统数据库是数据库管理的核心组成部分,主要包含mysql、information_schema、performance_schema、sys,它们不用于存储业务数据,而是用于存储系统元数据、权限信息和性能监控数据。这些系统数据库是MySQL正常运行和高效管理的关键。
一、mysql
mysql是 MySQL 的核心系统数据库,它是 MySQL 服务器运行的"大脑"。这个数据库存储了所有与用户权限 、系统配置 和元数据相关的信息,是 MySQL 正常运行的关键。
1. 核心特性
- 用户权限管理:存储所有用户账户信息、权限分配及角色定义,是数据库安全控制的核心。
- 系统配置存储:保存数据库的全局配置参数,如服务器变量、存储引擎设置等。
- 元数据维护:记录数据库对象(如表、视图、存储过程等)的创建信息及关联关系。
2. 核心表
| 表分类 | 表名 | 用途 | 说明 |
|---|---|---|---|
| 用户权限管理 | user | 存储全局用户账户及权限信息 | 包含用户名、主机名、加密密码、全局权限(如SELECT_priv、INSERT_priv)等字段,是数据库安全控制的核心 |
| 数据库级权限 | db | 管理数据库级别的访问权限 | 指定用户对特定数据库的操作权限(如CREATE、DROP),权限粒度细化到数据库级别 |
| 表级权限 | tables_priv | 控制表级别的操作权限 | 记录用户对具体表的权限(如UPDATE、DELETE),支持更细粒度的权限管理 |
| 列级权限 | columns_priv | 实现列级别的访问控制 | 定义用户对表中特定列的权限(如仅允许修改某列数据),实现精细化权限管理 |
| 程序对象权限 | procs_priv | 管理存储过程/函数权限 | 存储用户对存储过程和函数的执行权限,控制程序对象的访问 |
| 代理权限 | proxies_priv | 管理代理用户权限 | 允许一个用户以另一个用户身份执行操作,支持权限代理机制 |
| 服务器配置 | servers | 存储服务器配置信息 | 记录MySQL服务器实例的配置参数,如服务器地址、端口等 |
| 事件调度器 | event | 管理事件调度器信息 | 包含事件名称、执行时间表达式、状态(ENABLED/DISABLED)等,用于定时任务管理 |
| 时区信息 | time_zone | 存储时区配置 | 包含时区名称、时区偏移量、是否启用等信息,支持多时区应用 |
| 时区转换 | time_zone_leap_second | 记录闰秒信息 | 存储闰秒发生时间及调整值,确保时间计算的准确性 |
| 时区名称映射 | time_zone_name | 时区名称与ID映射 | 关联时区名称与内部标识符,方便时区查询 |
| 时区偏移 | time_zone_transition | 时区转换历史 | 记录时区偏移量的历史变化,支持时间相关计算 |
| 插件管理 | plugin | 存储已安装插件信息 | 包含插件名称、状态(ACTIVE/INACTIVE)、版本、描述等,支持插件扩展 |
| 服务器变量 | global_variables | 存储全局服务器变量 | 包含变量名(如max_connections)、当前值、默认值等,影响服务器行为 |
| 会话变量 | session_variables | 存储会话级变量 | 与全局变量类似,但仅影响当前会话,支持个性化配置 |
| 帮助信息 | help_topic | 存储帮助主题信息 | 包含帮助主题ID、名称、描述等,支持内置帮助系统 |
| 帮助内容 | help_relation | 关联帮助主题与内容 | 映射帮助主题与详细内容的关联关系,构建帮助系统框架 |
| 帮助类别 | help_category | 管理帮助分类 | 定义帮助信息的分类体系,方便用户按类别查询帮助 |
| 慢查询日志 | slow_log | 记录慢查询信息 | 存储执行时间超过阈值的SQL语句,用于性能分析(需启用慢查询日志功能) |
3. 权限管理说明
3.1. 权限层次结构
MySQL 的权限是分层管理的,从高到低依次为:
- 全局权限 (
user表):影响整个服务器。 - 数据库级别权限 (
db表):影响特定数据库。 - 表级别权限 (
tables_priv表):影响特定表。 - 列级别权限 (
columns_priv表):影响特定列。
3.2. 权限类型
| 权限类型 | 说明 | 作用范围 |
|---|---|---|
SELECT |
查询数据 | 全局、数据库、表、列 |
INSERT |
插入数据 | 全局、数据库、表、列 |
UPDATE |
更新数据 | 全局、数据库、表、列 |
DELETE |
删除数据 | 全局、数据库、表、列 |
CREATE |
创建数据库/表 | 全局、数据库 |
DROP |
删除数据库/表 | 全局、数据库 |
GRANT OPTION |
授予权限 | 全局、数据库 |
CREATE TEMPORARY TABLES |
创建临时表 | 全局、数据库 |
LOCK TABLES |
锁定表 | 全局、数据库 |
CREATE VIEW |
创建视图 | 全局、数据库 |
SHOW VIEW |
查看视图 | 全局、数据库 |
EXECUTE |
执行存储过程 | 全局、数据库、表 |
4. 常用操作
4.1. 查看所有用户
sql
SELECT User, Host FROM mysql.user;
4.2. 授予权限
sql
-- 授予用户对test数据库的SELECT权限
GRANT SELECT ON test.* TO 'user'@'localhost';
-- 授予用户对所有数据库的SELECT权限
GRANT SELECT ON *.* TO 'user'@'localhost';
-- 授予用户对特定表的权限
GRANT SELECT, INSERT ON test.users TO 'user'@'localhost';
-- 授予用户对特定列的权限
GRANT SELECT (name, email) ON test.users TO 'user'@'localhost';
4.3. 查看特定用户的权限
sql
-- 查看用户权限
SHOW GRANTS FOR 'user'@'localhost';
-- 查看用户权限的详细信息
SELECT * FROM mysql.user WHERE User = 'user' AND Host = 'localhost';
4.4. 修改权限
sql
-- 修改用户密码
ALTER USER 'user'@'localhost' IDENTIFIED BY 'new_password';
-- 重置密码
SET PASSWORD FOR 'user'@'localhost' = PASSWORD('new_password');
-- 刷新权限
FLUSH PRIVILEGES;
4.5. 删除用户权限
sql
-- 删除用户权限
REVOKE SELECT ON test.* FROM 'user'@'localhost';
-- 删除用户
DROP USER 'user'@'localhost';
5. 常见问题
5.1. 无法登录
- 检查
user表中的用户和密码 - 确认
Host字段是否匹配连接IP - 使用
FLUSH PRIVILEGES刷新权限
5.2. 权限不生效
- 确认是否执行了
FLUSH PRIVILEGES - 检查权限是否在正确的表中(如
db表 vsuser表)
5.3. 密码重置
sql
-- 停止MySQL服务
sudo systemctl stop mysql
-- 以跳过权限检查的方式启动
sudo mysqld_safe --skip-grant-tables &
-- 登录MySQL
mysql -u root
-- 重置密码
USE mysql;
UPDATE user SET authentication_string = PASSWORD('new_password') WHERE User = 'root';
-- 重启MySQL服务
sudo systemctl restart mysql
二、information_schema
information_schema是 MySQL 的核心系统数据库,它提供了一个虚拟数据库,其中包含所有数据库的元数据信息。这个数据库不存储实际业务数据,而是提供关于数据库结构、表、列、索引、视图等的描述性信息。
1. 核心特性
- 标准系统数据库:所有 MySQL 版本都支持。
- 只读视图:不能直接修改数据,只能查询。
- 动态生成的虚拟数据库:数据不存储在磁盘上,而是内部动态生成。
- 元数据查询中心:数据库管理员和开发人员的"数据库百科全书"。
- 标准 SQL 兼容:使用标准 SQL 查询获取元数据。
2. 核心视图
| 视图分类 | 视图名称 | 用途 | 说明 |
|---|---|---|---|
| 数据库元数据 | SCHEMATA | 查看数据库列表及属性 | 包含所有数据库名称、默认字符集、排序规则等信息 |
| 表元数据 | TABLES | 查看表及视图基本信息 | 包含表所属数据库、表名、存储引擎、创建时间、更新时间等 |
| 列元数据 | COLUMNS | 查看表列详细信息 | 包含列所属表、列名、数据类型、是否允许NULL、默认值、字符最大长度等 |
| 索引元数据 | STATISTICS | 查看表索引信息 | 包含索引所属表、索引名、列名、索引顺序、索引类型(如BTREE)等 |
| 权限管理 | USER_PRIVILEGES | 查看用户全局权限 | 包含用户账号、权限类型(如SELECT)、是否可授权等 |
| 存储过程/函数 | ROUTINES | 查看存储过程和函数 | 包含名称、类型(PROCEDURE/FUNCTION)、所属数据库、创建时间等 |
| 触发器 | TRIGGERS | 查看触发器信息 | 包含触发器所属表、事件类型(INSERT/UPDATE/DELETE)、触发时机(BEFORE/AFTER)等 |
| 事件调度器 | EVENTS | 查看事件调度器信息 | 包含事件名称、所属数据库、执行时间表达式、状态(ENABLED/DISABLED)等 |
| 字符集与排序 | CHARACTER_SETS | 查看支持的字符集 | 包含字符集名称、默认排序规则、描述等 |
| 排序规则 | COLLATIONS | 查看排序规则信息 | 包含排序规则名称、字符集、是否区分大小写、是否区分重音等 |
| 表约束 | KEY_COLUMN_USAGE | 查看表约束关系 | 包含约束类型(PRIMARY KEY/FOREIGN KEY)、关联表、关联列等 |
| 分区表 | PARTITIONS | 查看分区表信息 | 包含表名、分区名、分区方法(RANGE/HASH)、分区表达式等 |
| 插件管理 | PLUGINS | 查看已安装插件 | 包含插件名称、状态(ACTIVE/INACTIVE)、版本、描述等 |
| 服务器参数 | GLOBAL_VARIABLES | 查看全局服务器变量 | 包含变量名(如max_connections)、当前值、默认值等 |
| 会话参数 | SESSION_VARIABLES | 查看会话级变量 | 与GLOBAL_VARIABLES类似,但针对当前会话 |
| 引擎信息 | ENGINES | 查看存储引擎支持情况 | 包含引擎名称(如InnoDB)、支持状态(DEFAULT/YES/NO)、描述等 |
| 表空间 | TABLESPACES | 查看表空间信息 | 包含表空间名称、引擎、文件路径、空间大小等 |
| 锁信息 | TABLE_CONSTRAINTS | 查看表约束类型 | 包含表名、约束类型(PRIMARY KEY/UNIQUE/FOREIGN KEY)等 |
| 外键关系 | REFERENTIAL_CONSTRAINTS | 查看外键关联关系 | 包含父表、子表、关联列、更新/删除规则等 |
| 视图定义 | VIEWS | 查看视图定义详情 | 包含视图所属数据库、视图名、定义SQL语句、是否可更新等 |
3. 常用操作
3.1. 查询所有数据库
sql
SELECT SCHEMA_NAME AS `Database`
FROM information_schema.SCHEMATA;
3.2. 查询特定数据库的所有表
sql
SELECT TABLE_NAME AS `Table`
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'your_database_name';
3.3. 查询表结构
sql
SELECT
COLUMN_NAME AS `Column`,
DATA_TYPE AS `Type`,
IS_NULLABLE AS `Nullable`,
COLUMN_KEY AS `Key`,
COLUMN_DEFAULT AS `Default`,
EXTRA AS `Extra`
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'your_database_name'
AND TABLE_NAME = 'your_table_name';
3.4. 查询索引信息
sql
SELECT
INDEX_NAME AS `Index`,
COLUMN_NAME AS `Column`,
SEQ_IN_INDEX AS `Seq`,
NON_UNIQUE AS `NonUnique`
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'your_database_name'
AND TABLE_NAME = 'your_table_name';
3.5. 查询外键关系
sql
SELECT
CONSTRAINT_NAME AS `Constraint`,
REFERENCED_TABLE_NAME AS `Referenced Table`,
REFERENCED_COLUMN_NAME AS `Referenced Column`
FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = 'your_database_name'
AND TABLE_NAME = 'your_table_name'
AND REFERENCED_TABLE_NAME IS NOT NULL;
3.6. 查询视图定义
sql
SELECT
TABLE_NAME AS `View`,
VIEW_DEFINITION AS `Definition`
FROM information_schema.VIEWS
WHERE TABLE_SCHEMA = 'your_database_name';
3.7. 数据库结构比较
sql
-- 比较两个数据库的表结构差异
SELECT
TABLE_NAME,
COLUMN_NAME,
DATA_TYPE AS source_type,
(SELECT DATA_TYPE
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'target_db'
AND TABLE_NAME = source.TABLE_NAME
AND COLUMN_NAME = source.COLUMN_NAME) AS target_type
FROM information_schema.COLUMNS source
WHERE TABLE_SCHEMA = 'source_db'
AND (SELECT DATA_TYPE
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'target_db'
AND TABLE_NAME = source.TABLE_NAME
AND COLUMN_NAME = source.COLUMN_NAME) IS NULL
OR (SELECT DATA_TYPE
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'target_db'
AND TABLE_NAME = source.TABLE_NAME
AND COLUMN_NAME = source.COLUMN_NAME) <> source.DATA_TYPE;
三、performance_schema
performance_schema是 MySQL 5.5 版本引入的核心性能监控工具,用于收集 MySQL 服务器运行时的底层事件信息 。它也是一个虚拟数据库 ,数据存储在内存中,重启后会丢失。它和慢查询日志不同,它提供的是实时、细粒度的性能数据,而不是事后分析的慢查询记录。
1. 核心特性
- 低开销设计:采用轻量级检测点机制,默认配置下对性能影响小于5%,但启用大量监控项时可能增加开销。
- 内存存储:所有数据保存在内存中,重启后数据丢失,不占用磁盘空间。
- 事件驱动:以"事件"为单位记录资源消耗(如时间、次数),涵盖线程、语句、锁、I/O等关键指标。
- 细粒度监控:比慢查询日志提供更详细的性能数据。
- 实时性:可以实时监控数据库运行状态。
- 可配置性:按需选择监控哪些事件。
- 标准化SQL:数据存储在标准 MySQL 表中,便于使用 SQL 分析。
2. 核心运行机制
-
事件分类与采集
performance_schema通过"检测点"捕获服务器内部事件,事件类型包括:
- 语句事件:SQL语句的执行(如解析、排序、执行)。
- 等待事件:资源等待(如锁、I/O、线程同步)。
- 阶段事件:SQL执行各阶段(如解析、优化、执行)。
- 事务事件:事务的启动、提交、回滚。
- 内存事件:内存分配与释放。
-
存储引擎与表结构
performance_schema使用专用存储引擎,表结构按功能分类:
- 当前事件表 (如
events_statements_current):记录当前活跃事件。 - 历史事件表 (如
events_statements_history):记录最近完成的事件(线程级)。 - 长历史事件表 (如
events_statements_history_long):记录全局历史事件。 - 摘要表 (如
events_statements_summary_by_digest):按语句摘要聚合统计数据。 - 配置表 (如
setup_instruments、setup_consumers):动态控制监控项与数据存储。
- 当前事件表 (如
-
数据采集与存储
- 事件数据通过检测点实时采集,存储在内存表中,支持
SELECT查询。 - 配置表(如
setup_instruments)可启用/禁用特定事件采集,减少开销。
- 事件数据通过检测点实时采集,存储在内存表中,支持
3. 核心表
| 表分类 | 表名 | 用途 | 说明 |
|---|---|---|---|
| 语句事件记录 | events_statements_current | 记录当前执行的SQL详细信息 | 如执行时间、扫描行数、锁等待等 |
| 语句事件记录 | events_statements_history | 记录最近完成的SQL历史 | 按线程分组,存储最近10条执行记录 |
| 语句事件记录 | events_statements_history_long | 全局SQL历史记录 | 存储所有线程的SQL执行情况,最多10000条 |
| 语句事件记录 | events_statements_summary_by_digest | SQL摘要聚合统计 | 按SQL指纹分组,统计执行次数、总耗时、平均耗时等 |
| 等待事件记录 | events_waits_current | 当前资源等待事件 | 如锁等待、I/O等待、线程同步等 |
| 等待事件记录 | events_waits_history | 最近完成的等待事件 | 按线程分组,存储最近10条等待记录 |
| 等待事件记录 | events_waits_history_long | 全局等待事件历史 | 存储所有线程的等待事件,最多10000条 |
| 等待事件记录 | events_waits_summary_by_event_name | 按事件名称聚合统计 | 如锁等待次数、总耗时、平均耗时等 |
| 阶段事件记录 | events_stages_current | 当前SQL执行阶段 | 如解析、优化、执行等阶段 |
| 阶段事件记录 | events_stages_history | 历史阶段事件 | 按线程分组,存储最近10条阶段记录 |
| 阶段事件记录 | events_stages_history_long | 全局阶段事件历史 | 存储所有线程的阶段事件,最多10000条 |
| 阶段事件记录 | events_stages_summary_by_event_name | 按阶段名称聚合统计 | 如解析阶段耗时、执行阶段耗时等 |
| 事务事件记录 | events_transactions_current | 当前执行的事务信息 | 如事务ID、状态、开始时间等 |
| 事务事件记录 | events_transactions_history | 最近完成的事务历史 | 按线程分组,存储最近10条事务记录 |
| 事务事件记录 | events_transactions_history_long | 全局事务历史 | 存储所有线程的事务记录,最多10000条 |
| 事务事件记录 | events_transactions_summary_by_transaction | 事务级别统计 | 如提交次数、回滚次数、事务耗时等 |
| 内存事件记录 | memory_summary_by_account_by_event_name | 按账户和事件统计内存 | 如分配次数、释放次数、内存使用量等 |
| 内存事件记录 | memory_summary_by_host_by_event_name | 按主机和事件统计内存 | 如内存分配、释放、使用量等 |
| 内存事件记录 | memory_summary_by_thread_by_event_name | 按线程和事件统计内存 | 如线程内存使用情况、内存泄漏检测等 |
| 内存事件记录 | memory_summary_global_by_event_name | 全局内存使用统计 | 如总分配量、总释放量、当前使用量等 |
| 文件I/O事件 | file_summary_by_event_name | 按事件统计文件I/O | 如读写次数、耗时、数据量等 |
| 文件I/O事件 | file_summary_by_instance | 按文件实例统计I/O | 如文件读写次数、耗时、数据量等 |
| 文件I/O事件 | table_io_waits_summary_by_table | 按表统计I/O等待 | 如表读写等待次数、耗时等 |
| 配置表 | setup_instruments | 配置事件采集项 | 启用/禁用特定事件监控,如锁、I/O、SQL执行等 |
| 配置表 | setup_consumers | 配置数据存储目标 | 控制是否记录历史、摘要或全局数据 |
| 配置表 | setup_timers | 配置计时器类型 | 如CPU时间、线程时间、墙钟时间等 |
| 配置表 | setup_actors | 配置用户/主机监控 | 设置用户和主机的监控权限 |
| 其他表 | threads | 服务器线程信息 | 如线程ID、类型、状态、CPU使用率等 |
| 其他表 | users | 用户信息 | 如用户名、主机、权限等 |
| 其他表 | variables_by_thread | 线程变量使用 | 如线程级变量值、默认值、是否修改等 |
| 其他表 | mutex_instances | 互斥同步对象实例 | 记录系统中使用互斥量对象的所有记录,name为wait/synch/mutex/* |
| 其他表 | rwlock_instances | 读写锁同步对象实例 | 记录系统中使用读写锁对象的所有记录,name为wait/synch/rwlock/* |
| 其他表 | socket_instances | 活跃会话对象实例 | 记录thread_id, socket_id, ip和port,用于关联应用与数据库 |
4. 常用操作
4.1. 检查是否已启用
sql
SHOW VARIABLES LIKE 'performance_schema';
-- 默认值为 ON(MySQL 5.7+)
4.2. 开启特定监控项
sql
-- 开启所有事件的监控(谨慎使用,可能影响性能)
UPDATE performance_schema.setup_consumers SET ENABLED = 'YES';
-- 按需开启特定监控(推荐)
UPDATE performance_schema.setup_consumers SET ENABLED = 'YES'
WHERE NAME LIKE 'events_statements%'; -- 开启SQL语句监控
4.3. 配置监控粒度
sql
-- 监控所有用户的SQL语句
UPDATE performance_schema.setup_actors SET ENABLED = 'YES', HISTORY = 'YES'
WHERE USER = '%';
4.4. 查看最耗时的SQL语句
sql
SELECT
DIGEST_TEXT AS 'SQL语句',
COUNT_STAR AS '执行次数',
SUM_TIMER_WAIT / 1e9 AS '总耗时(秒)',
AVG_TIMER_WAIT / 1e9 AS '平均耗时(秒)'
FROM performance_schema.events_statements_summary_by_digest
ORDER BY SUM_TIMER_WAIT DESC
LIMIT 10;
4.5. 查看最近执行的SQL详情
sql
SELECT
EVENT_ID,
SQL_TEXT AS 'SQL语句',
TIMER_WAIT / 1e9 AS '耗时(秒)',
LOCK_TIME / 1e9 AS '锁等待时间(秒)',
ROWS_EXAMINED AS '扫描行数',
ROWS_SENT AS '返回行数'
FROM performance_schema.events_statements_history
ORDER BY TIMER_WAIT DESC
LIMIT 10;
4.6. 分析I/O瓶颈
sql
SELECT
EVENT_NAME AS '事件类型',
COUNT_STAR AS '次数',
SUM_TIMER_WAIT / 1e9 AS '总等待时间(秒)',
AVG_TIMER_WAIT / 1e9 AS '平均等待时间(秒)'
FROM performance_schema.file_summary_by_event_name
WHERE EVENT_NAME LIKE '%read%'
ORDER BY SUM_TIMER_WAIT DESC;
4.7. 监控长期运行事务
sql
SELECT
THREAD_ID,
EVENT_ID,
SQL_TEXT,
TIMER_START,
TIMER_WAIT / 1e9 AS '已运行时间(秒)'
FROM performance_schema.events_transactions_current
WHERE STATE = 'ACTIVE'
ORDER BY TIMER_WAIT DESC;
四、sys
sys是MySQL 5.7.7+ 引入的一个辅助库,旨在简化数据库管理员(DBA)和开发者的性能监控与诊断工作。它基于performance_schema和information_schema,通过视图、存储过程和函数的形式,提供更直观、易用的数据库性能和元数据信息。
sys 是 MySQL 的"性能分析助手",它将复杂的性能数据转换为易于理解的视图,让数据库管理员和开发人员能够快速识别和解决性能问题。
1. 核心特性
-
简化性能监控
- sys库封装了performance_schema的复杂表结构,提供预聚合的视图,直接展示关键性能指标(如查询执行时间、锁等待、IO延迟等)。
- 例如,通过
host_summary视图可快速查看各主机的连接数、内存使用、IO延迟等概览信息。
-
快速诊断问题
- 提供针对慢查询、热点表、锁等待等常见问题的专用视图,帮助定位性能瓶颈。
- 例如,
statements_with_runtimes_in_95th_percentile视图可识别执行时间最长的查询。
-
统一元数据查询
- 集成information_schema的信息,提供关于数据库对象(如表、索引、存储过程)的详细元数据视图。
2. 主要内容
2.1. 视图(Views)
sys库包含大量视图,按功能可分为以下几类:
-
性能视图
statement_analysis:查询执行统计(次数、总延迟、平均延迟等)。innodb_lock_waits:显示锁等待链,帮助解决死锁问题。io_by_thread_by_latency:按线程统计IO延迟,识别高负载线程。
-
元数据视图
schema_table_statistics:统计表的增删改查操作量及IO耗时。schema_unused_indexes:识别未使用的冗余索引,优化表结构。
-
系统状态视图
host_summary:主机级性能概览(连接数、内存使用、IO等)。memory_by_thread_by_current_bytes:按线程统计内存使用情况。
视图命名规则 :大部分视图成对出现,带x$前缀的视图显示原始数据(如皮秒单位),不带前缀的视图显示经过单位换算的数据(如毫秒、秒)。 比如:host_summary_by_file_io(换算后)与x$host_summary_by_file_io(原始数据)。
2.2. 存储过程(Procedures)
用于动态配置performance_schema的监控项,例如:
ps_setup_enable_instrument('wait'):启用等待事件监控。ps_setup_disable_consumer('history_long'):禁用历史长事件收集。ps_setup_reset_to_default(TRUE):重置performance_schema为默认配置。
2.3. 函数(Functions)
提供格式化输出功能,例如:
format_bytes(bytes):将字节数转换为易读的单位(如KB、MB)。format_time(microseconds):将微秒转换为时间字符串(如00:00:01.234)。
3. 常用操作
3.1. 排查慢查询
sql
-- 查看执行时间最长的10个查询
SELECT * FROM sys.statement_analysis
ORDER BY total_latency DESC
LIMIT 10;
3.2. 识别热点表
sql
-- 查看操作最频繁的表
SELECT * FROM sys.schema_table_statistics
ORDER BY rows_fetched + rows_inserted + rows_updated + rows_deleted DESC
LIMIT 10;
3.3. 分析锁等待
sql
-- 查看当前锁等待链
SELECT * FROM sys.innodb_lock_waits;
3.4. 监控IO性能
sql
-- 按主机统计文件IO延迟
SELECT * FROM sys.host_summary_by_file_io
ORDER BY io_latency DESC;
3.5. 查看使用临时表的查询
sql
SELECT
DIGEST_TEXT AS 'SQL语句',
COUNT_STAR AS '执行次数',
SUM_CREATED_TMP_DISK_TABLES AS '磁盘临时表次数',
SUM_CREATED_TMP_TABLES AS '临时表总数'
FROM sys.statements_with_temp_tables
ORDER BY SUM_CREATED_TMP_TABLES DESC
LIMIT 10;
3.6. 查看当前活动链接
sql
SELECT
ID,
USER,
HOST,
DB,
COMMAND,
TIME,
STATE,
INFO
FROM sys.processlist
ORDER BY TIME DESC;
3.7. 查看内存使用情况
sql
SELECT
EVENT_NAME AS '内存事件',
COUNT_STAR AS '次数',
SUM_NUMBER_OF_BYTES_USED / 1024 / 1024 AS '总内存(MB)'
FROM sys.memory_global_by_current_bytes
ORDER BY SUM_NUMBER_OF_BYTES_USED DESC
LIMIT 10;
3.8. 查看索引使用情况
sql
SELECT
TABLE_SCHEMA AS '数据库',
TABLE_NAME AS '表名',
INDEX_NAME AS '索引名',
SEQ_IN_INDEX AS '索引顺序',
COLUMN_NAME AS '列名',
CARDINALITY AS '基数',
NON_UNIQUE AS '是否唯一'
FROM sys.schema_index_statistics
ORDER BY TABLE_SCHEMA, TABLE_NAME, INDEX_NAME;