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;
操作后结果:
| Field | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| emp_id | int(11) | NO | PRI | NULL | auto_increment |
| emp_name | varchar(20) | NO | NULL | ||
| dept | varchar(20) | YES | MUL | 技术部 | |
| score | decimal(5,2) | YES | NULL |
结果解读:
Field:列名Type:数据类型Null:是否允许 NULL(NO= 不允许)Key:索引类型(PRI= 主键,MUL= 普通索引,UNI= 唯一索引)Default:默认值Extra:额外信息(auto_increment= 自增)
场景二:查看建表 SQL(SHOW CREATE TABLE)
当前数据状态:基于上文 employees 表。
执行语句:
SHOW CREATE TABLE employees;
操作后结果:
| Table | Create Table |
|---|---|
| employees | CREATE 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;
操作后结果:
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Cardinality | Index_type |
|---|---|---|---|---|---|---|
| employees | 0 | PRIMARY | 1 | emp_id | 0 | BTREE |
| employees | 1 | idx_dept | 1 | dept | 0 | BTREE |
结果解读:
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_name | Value |
|---|---|
| Threads_cached | 0 |
| Threads_connected | 3 |
| Threads_created | 5 |
| Threads_running | 1 |
结果解读:
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_name | Value |
|---|---|
| max_connections | 151 |
character_set%:
| Variable_name | Value |
|---|---|
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_server | utf8mb4 |
结果解读:
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;
操作后结果(示例):
| Id | User | Host | db | Command | Time | State | Info |
|---|---|---|---|---|---|---|---|
| 1 | root | localhost | NULL | Sleep | 120 | NULL | |
| 2 | app_user | 192.168.1.5 | mydb | Query | 0 | starting | SELECT * FROM employees |
| 3 | root | localhost | NULL | Query | 0 | starting | SHOW 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 排查慢查询?
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 协议。