乐途乐途
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
  • 学习路径
  • 第1章 数据库基础与安装

    • MySQL 简介
    • MySQL 5.6 到 5.7 到 8.0 关键差异速查
    • 安装 MySQL 5.7
    • 连接与断开服务器
    • 创建数据库
    • 创建数据表
    • 数据库与数据表
    • 加载数据
    • 获取数据库信息
    • 批处理模式
    • SHOW 语句汇总
    • FLUSH 与 RESET 语句
    • my.cnf 核心参数
    • 字符集与排序规则
  • 第2章 SQL基础查询

    • SELECT
    • WHERE
    • ORDER BY
    • LIMIT
    • COUNT
    • 聚合函数
    • 比较运算符
    • 逻辑运算符
    • 算术运算符
    • 模式匹配
    • NULL 值处理
    • UPDATE
    • DELETE
    • REPLACE
    • SELECT INTO
  • 第3章 数据类型与运算符

    • 数值类型
    • 字符串类型
    • 日期时间类型
    • BIT 类型
    • ENUM 类型
    • SET 类型
    • JSON 类型
    • 类型转换
  • 第4章 函数与表达式

    • 字符串函数
    • 数值函数
    • 日期函数
    • 全文检索函数
  • 第5章 高级查询与子查询

    • JOIN
    • 子查询
    • UNION
    • GROUP BY
    • HAVING
    • DISTINCT
  • 第6章 表与索引

    • 数据定义语言
    • 修改表结构
    • 视图
    • 修改视图与检查选项
    • 外键
    • 索引
    • 唯一索引
    • 复合索引
    • 存储引擎对比
    • 分区表
    • 第一范式与第二范式
    • 第三范式与 BC 范式
    • 反范式设计
  • 第7章 存储过程与函数

    • 存储过程
    • 存储函数
    • 变量
    • 流程控制
    • 游标
    • 预处理语句
  • 第8章 事务与锁

    • 事务
    • 事务隔离级别
    • 锁机制
    • MVCC
    • 死锁专题分析
    • LOCK TABLES
    • XA 事务
  • 第9章 用户管理与安全

    • 用户管理
    • 权限管理
    • 角色
    • SQL 注入防范
  • 第10章 性能优化入门

    • 执行计划
    • 索引优化
    • 查询优化
    • 查询优化器提示
    • 慢查询日志
    • InnoDB 深入机制
    • InnoDB 专项优化
    • Performance Schema
    • sys Schema
  • 第11章 复制与高可用

    • 主从复制原理
    • 半同步复制配置
    • binlog 开启与 point-in-time 恢复
    • mysqldump 全库备份
    • mysqldump 单表与条件备份
    • mysqldump 恢复与导入
    • xtrabackup 全量热备
    • xtrabackup 准备与恢复
    • xtrabackup 增量与流式备份
  • 第12章 触发器与事件

    • 触发器
    • 事件调度器
  • 参考

    • MySQL 5.7 专业术语大全
    • MySQL 5.7 关键字与保留字大全

SHOW 语句汇总

导学

SHOW 语句是 MySQL 的"信息查询瑞士军刀"——查看有哪些数据库、表结构什么样、索引怎么建的、当前谁在连接、服务器状态如何,全部靠它。掌握 SHOW 语句,是日常开发和运维 MySQL 的基本功。

定义

SHOW 语句:MySQL 提供的元数据(metadata)查询语句,用于查看数据库、表、列、索引、状态、权限等系统信息,不修改任何数据。

核心语法分类

一、数据库相关

-- 查看所有数据库
SHOW DATABASES;

-- 查看当前使用的数据库
SELECT DATABASE();

-- 查看创建数据库的 SQL
SHOW CREATE DATABASE db_name;

二、表相关

-- 查看当前库的所有表
SHOW TABLES;
SHOW TABLES FROM db_name;

-- 查看表结构(三种等价写法)
SHOW COLUMNS FROM table_name;
SHOW FIELDS FROM table_name;
DESC table_name;
DESCRIBE table_name;

-- 查看建表 SQL
SHOW CREATE TABLE table_name;

-- 查看表状态(引擎、行数、大小等)
SHOW TABLE STATUS LIKE 'table_name';

三、索引相关

-- 查看表的索引
SHOW INDEX FROM table_name;
SHOW KEYS FROM table_name;

四、状态与变量

-- 查看服务器状态(如连接数、查询数、缓存命中率)
SHOW [GLOBAL | SESSION] STATUS LIKE 'Threads%';

-- 查看系统变量(如最大连接数、缓冲区大小)
SHOW [GLOBAL | SESSION] VARIABLES LIKE 'max_connections';

-- 查看当前连接和正在执行的 SQL
SHOW PROCESSLIST;

五、权限相关

-- 查看当前用户的权限
SHOW GRANTS;

-- 查看指定用户的权限
SHOW GRANTS FOR 'user'@'host';

六、引擎与插件

-- 查看支持的存储引擎
SHOW ENGINES;

-- 查看已安装的插件
SHOW PLUGINS;

SQL 示例

场景一:查看表结构(DESC / SHOW COLUMNS)

执行语句:

-- 先创建演示表
DROP TABLE IF EXISTS employees;

CREATE TABLE employees (
    emp_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '员工ID',
    emp_name VARCHAR(20) NOT NULL COMMENT '姓名',
    dept VARCHAR(20) DEFAULT '技术部' COMMENT '部门',
    score DECIMAL(5,2) COMMENT '评分',
    INDEX idx_dept (dept)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工表';

-- 查看表结构
DESC employees;
-- 等价于:SHOW COLUMNS FROM employees;

操作后结果:

FieldTypeNullKeyDefaultExtra
emp_idint(11)NOPRINULLauto_increment
emp_namevarchar(20)NONULL
deptvarchar(20)YESMUL技术部
scoredecimal(5,2)YESNULL

结果解读:

  • Field:列名
  • Type:数据类型
  • Null:是否允许 NULL(NO = 不允许)
  • Key:索引类型(PRI = 主键,MUL = 普通索引,UNI = 唯一索引)
  • Default:默认值
  • Extra:额外信息(auto_increment = 自增)

场景二:查看建表 SQL(SHOW CREATE TABLE)

当前数据状态:基于上文 employees 表。

执行语句:

SHOW CREATE TABLE employees;

操作后结果:

TableCreate Table
employeesCREATE TABLE employees (\n emp_id int(11) NOT NULL AUTO_INCREMENT COMMENT '员工ID',\n emp_name varchar(20) NOT NULL COMMENT '姓名',\n dept varchar(20) DEFAULT '技术部' COMMENT '部门',\n score decimal(5,2) DEFAULT NULL COMMENT '评分',\n PRIMARY KEY (emp_id),\n KEY idx_dept (dept)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工表'

结果解读:SHOW CREATE TABLE 返回完整的建表 SQL,包括所有列定义、索引、引擎、字符集、注释等。这是复制表结构、查看完整定义的最可靠方式。注意结果中换行被转义为 \n。

场景三:查看索引信息(SHOW INDEX)

当前数据状态:基于上文 employees 表。

执行语句:

SHOW INDEX FROM employees;
-- 等价于:SHOW KEYS FROM employees;

操作后结果:

TableNon_uniqueKey_nameSeq_in_indexColumn_nameCardinalityIndex_type
employees0PRIMARY1emp_id0BTREE
employees1idx_dept1dept0BTREE

结果解读:

  • Non_unique:0 = 唯一索引,1 = 非唯一索引
  • Key_name:索引名(PRIMARY 是主键)
  • Seq_in_index:索引中的列顺序(复合索引中第几列)
  • Column_name:索引列名
  • Cardinality:基数(该列不重复值的大致数量,0 表示未统计)
  • Index_type:索引类型(MySQL 5.7 中 InnoDB 和 MyISAM 都是 BTREE)

场景四:查看服务器状态(SHOW STATUS)

执行语句:

-- 查看线程相关状态
SHOW GLOBAL STATUS LIKE 'Threads%';

-- 查看查询相关状态
SHOW GLOBAL STATUS LIKE 'Com_select';
SHOW GLOBAL STATUS LIKE 'Slow_queries';

操作后结果(示例值,实际因运行状态而异):

Threads%:

Variable_nameValue
Threads_cached0
Threads_connected3
Threads_created5
Threads_running1

结果解读:

  • Threads_connected:当前连接数
  • Threads_running:正在执行查询的连接数
  • Threads_created:历史创建的线程总数
  • Com_select:执行的 SELECT 语句总数(可用于计算 QPS)
  • Slow_queries:慢查询总数(超过 long_query_time 的查询)

场景五:查看系统变量(SHOW VARIABLES)

执行语句:

-- 查看最大连接数
SHOW VARIABLES LIKE 'max_connections';

-- 查看缓冲区大小
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';

-- 查看字符集设置
SHOW VARIABLES LIKE 'character_set%';

操作后结果(示例值):

max_connections:

Variable_nameValue
max_connections151

character_set%:

Variable_nameValue
character_set_clientutf8mb4
character_set_connectionutf8mb4
character_set_databaseutf8mb4
character_set_serverutf8mb4

结果解读:

  • max_connections:允许的最大并发连接数(默认 151)
  • innodb_buffer_pool_size:InnoDB 缓冲池大小(影响性能的关键参数,建议设为物理内存的 50%~75%)
  • character_set_*:字符集配置,utf8mb4 支持完整的 Unicode(包括 emoji)

GLOBAL vs SESSION:SHOW GLOBAL VARIABLES 看全局默认值;SHOW SESSION VARIABLES 看当前连接的设置。修改时用 SET GLOBAL(需权限,影响新连接)或 SET SESSION(只影响当前连接)。

场景六:查看当前连接和执行的 SQL(SHOW PROCESSLIST)

执行语句:

SHOW PROCESSLIST;
-- 或查看更完整的信息(5.7.7+)
SELECT * FROM information_schema.PROCESSLIST;

操作后结果(示例):

IdUserHostdbCommandTimeStateInfo
1rootlocalhostNULLSleep120NULL
2app_user192.168.1.5mydbQuery0startingSELECT * FROM employees
3rootlocalhostNULLQuery0startingSHOW PROCESSLIST

结果解读:

  • Id:连接 ID,可用 KILL id 终止连接
  • User / Host:连接的用户和来源
  • db:当前使用的数据库
  • Command:当前命令(Sleep = 空闲,Query = 执行查询)
  • Time:当前状态持续时间(秒)
  • State:线程状态(starting、Sending data、Locked 等)
  • Info:正在执行的 SQL 文本

运维技巧:发现 Time 很大且 State 为 Locked 或 Sending data 的连接,可能是慢查询或死锁,需要关注。

场景七:查看用户权限(SHOW GRANTS)

执行语句:

-- 查看当前用户权限
SHOW GRANTS;

-- 查看指定用户权限
SHOW GRANTS FOR 'root'@'localhost';

操作后结果(root 用户示例):

Grants for root@localhost
GRANT ALL PRIVILEGES ON . TO 'root'@'localhost' WITH GRANT OPTION

结果解读:SHOW GRANTS 显示用户的完整权限列表。ALL PRIVILEGES ON *.* 表示对所有库的所有表有所有权限;WITH GRANT OPTION 表示可以将权限授予其他用户。

常见误区

误区正解
"SHOW 语句可以修改数据"不能。SHOW 是只读查询,只返回元数据信息。
"DESC 和 SHOW CREATE TABLE 显示的信息一样"不一样。DESC 只显示列定义和索引概览;SHOW CREATE TABLE 显示完整的建表 SQL,包括引擎、字符集、注释等。
"SHOW STATUS 和 SHOW VARIABLES 是一回事"不是。STATUS 是运行时状态(如当前连接数、查询数),动态变化;VARIABLES 是配置参数(如最大连接数、缓冲区大小),需要手动修改。
"SHOW PROCESSLIST 只能看自己的连接"不是。有 PROCESS 权限的用户可以看到所有连接,否则只能看到自己的。
"SHOW INDEX 的 Cardinality 很精确"不精确。Cardinality 是统计采样估算值,可能为 0(未统计)或偏差较大。精确值用 SELECT COUNT(DISTINCT column)。
"SHOW 语句可以用在任意存储引擎上"可以。SHOW 是服务器层功能,与存储引擎无关。

面试考点

Q:DESC 和 SHOW CREATE TABLE 的区别?

DESC(或 SHOW COLUMNS)显示列的简要信息(类型、NULL、Key、Default);SHOW CREATE TABLE 返回完整的建表 SQL,包含列定义、所有索引、存储引擎、字符集、表注释等。复制表结构时用 SHOW CREATE TABLE 更完整。

Q:SHOW STATUS 和 SHOW VARIABLES 的区别?

SHOW STATUS 看运行时状态(如 Threads_connected、Com_select、Slow_queries),数值随运行变化;SHOW VARIABLES 看配置参数(如 max_connections、innodb_buffer_pool_size),需要 SET 修改。一个是"现在发生了什么",一个是"系统怎么配置的"。

Q:如何通过 SHOW PROCESSLIST 排查慢查询?

  1. SHOW PROCESSLIST 查看 Time 列很大的连接;2. 关注 State 为 Sending data、Locked、Waiting for table lock 的线程;3. 查看 Info 列的 SQL 文本;4. 用 EXPLAIN 分析执行计划;5. 必要时用 KILL id 终止异常连接。

Q:SHOW INDEX 中的 Cardinality 有什么用?

Cardinality 表示索引列的不重复值数量估算。值越大,索引选择性越好,查询效率越高。如果 Cardinality 接近行数,索引效果好;如果接近 1(如性别字段),索引效果差。注意这是采样估算值,可能不准确,可用 ANALYZE TABLE 更新统计。

Q:如何查看 MySQL 是否支持某个存储引擎?

SHOW ENGINES; 查看所有引擎及其支持状态(YES = 支持且启用,DEFAULT = 默认,NO = 不支持,DISABLED = 支持但未启用)。

小结

  • SHOW 语句是 MySQL 的元数据查询工具,涵盖数据库、表、列、索引、状态、变量、权限、引擎等
  • 最常用:SHOW TABLES、DESC、SHOW CREATE TABLE、SHOW INDEX、SHOW PROCESSLIST、SHOW VARIABLES、SHOW STATUS
  • SHOW STATUS 看运行时状态,SHOW VARIABLES 看配置参数
  • SHOW PROCESSLIST 是排查慢查询和死锁的利器
  • 所有 SHOW 语句都是只读的,不修改数据

下一章引子:SHOW 语句让我们看清数据库的"外表",但事务的可靠性需要深入底层机制。接下来了解 MySQL 中支持分布式事务的 XA 协议。

上一页
批处理模式
下一页
FLUSH 与 RESET 语句