MySQL命令行查看全攻略:从版本到执行计划一次讲清 你是不是也遇到过这种场景在命令行里敲完一句select * from user报错才发现自己压根没切进需要的库刚上手 MySQL 时最让人懵的不是写增删改查而是“这个数据库里到底有什么、怎么才能看到”。Navicat 这类图形工具当然能双击展开可在生产环境、SSH 连上去的服务器上命令行仍然是绝大多数 DBA 和后台开发的第一选择。“mysql 怎么查看”这个搜索词背后其实是好几件事混在一起查看版本、查看数据库列表、查看表结构、查看具体数据、查看用户权限甚至查看一条 SQL 的执行计划。这篇文章就把我这些年在命令行里“查看 MySQL 家底”的常用命令和实操心得完整梳理一遍从新手最常见的卡点一直写到排查慢 SQL 时才能用到的进阶姿势。1. 先搞清楚你要“查看”的到底是什么1.1 把“查看”拆成四类场景我见过不少人搜“mysql怎么查看”其实是想要不同的结果。如果上来就把SHOW DATABASES背下来解决不了下一个问题。所以先把场景拆开你才知道该用哪条命令。查看环境与版本MySQL 装好了吗服务端是什么版本端口是多少字符集怎么配的这类信息决定后续连接参数、字符集兼容甚至备份恢复策略。查看库表元数据当前实例有哪些数据库每个库里有哪些表表的字段、索引、主键、建表语句是什么这类是日常开发里最常用的“看”法。查看业务数据表里实际存了什么记录条件查询、排序、分组、多表关联这是 SQL 查询的高频动作。查看运行状态当前有哪些客户端连着有没有慢查询连接数是否接近上限InnoDB 内部状态如何这类通常属于排查问题的范畴但也是“查看”的重要组成部分。把这四类场景分清楚后后面所有命令就有了归属。1.2 连接到 MySQL才有后面的“查看”无论是哪种“查看”前提都是成功连接上 MySQL。命令行登录基础命令是mysql -u root -p回车后输入密码就能进入 mysql 交互终端。如果目标库不在本机mysql -h 10.0.0.10 -P 3306 -u appuser -p-h指定主机-P指定端口注意大写P。连接后想确认自己有没有选错实例可以执行SELECT CURRENT_USER(); SELECT DATABASE();新手最容易在这一步踩三个坑一是本地安装的 MySQL 默认root账号只允许localhost登录直接-h 127.0.0.1也可能报错得先确认账号的 host 授权二是密码里带特殊字符时命令行里容易解析错误建议用-p不接密码回车后再输入三是连接超时但业务端口通着很可能是目标机防火墙拦了 3306或者是账号 host 不包含当前来源 IP。连接这一步看起来和“查看”没关系但很多“看不到数据库”“看不到表”的问题根源其实在这里。1.3 不知道怎么查时先让 MySQL 自己告诉你MySQL 内置了HELP命令和SHOW系列遇到不确定的关键字可以直接求助HELP SHOW;这个命令会列出所有SHOW相关的子命令。再或者用SHOW命令补全会列出以SHOW开头的全部语句再方向键上下选择。养成这个习惯后你会发现自己不需要死记硬背“查看”类命令MySQL 本身就帮你把“查看菜单”打开了。2. 查看 MySQL 版本、端口、字符集这些基础信息2.1 查看版本三条命令各有用途进入 MySQL 后最简单直接的SELECT VERSION();也可以SHOW VARIABLES LIKE version%;后者会显示version、version_comment、version_compile_machine、version_compile_os等信息更详细。如果不进入 MySQL在系统命令行直接看客户端版本mysql -V输出类似mysql Ver 14.14 Distrib 5.7.42, for Linux (x86_64)。这里有个容易忽略的点mysql 客户端版本和服务端版本不一定一致mysql -V只能代表客户端自带库版本排查服务端问题要以SELECT VERSION()为准。查看版本常用于确认 SQL 语法兼容性比如 MySQL 5.7 和 MySQL 8.0 在窗口函数、默认排序规则、账号认证插件等方面都有差异。升级或者迁移运维脚本前第一件事就是核对版本。2.2 查看配置项SHOW VARIABLES 是万能钥匙MySQL 的配置信息几乎都存在变量里SHOW VARIABLES是查看运行配置的万能入口。常用查看项包括-- 查看端口 SHOW VARIABLES LIKE port; -- 查看数据目录 SHOW VARIABLES LIKE datadir; -- 查看字符集相关配置 SHOW VARIABLES LIKE character_set%; -- 查看排序规则 SHOW VARIABLES LIKE collation%; -- 查看日志目录 SHOW VARIABLES LIKE log_error;查看端口在排查“应用连不上数据库”时特别有用。有时候你以为实例跑在 3306实际修改过配置后跑在 3307用这条能立刻确认端口。datadir则告诉你物理数据文件存放在哪个目录做备份或迁移时必须知道。字符集这块值得多说两句。很多乱码问题的根源不是应用代码写错了而是服务端、客户端、数据库表三级字符集不一致。查看命令执行后重点看几项SHOW VARIABLES LIKE character_set_server; -- 服务端默认字符集 SHOW VARIABLES LIKE character_set_client; -- 客户端传入字符集如果发现不一致可以在会话里临时调整SET NAMES utf8mb4;这是我最常用的“先查后改”操作排查乱码第一步永远是查不是改表。2.3 查看当前正在用哪个库连接 MySQL 后默认没有选中任何数据库执行查询前最容易犯的错就是“直接SELECT * FROM user然后报Table user doesnt exist”。因为user表在很多库都会存在系统也不知道你要查哪个库。用下面这条命令确认当前库SELECT DATABASE();返回NULL就说明还没选库。切换到目标库USE dbname;在 MySQL 8.0 里还可以用SHOW DATABASES;先列出所有库再从里面挑。这两个命令是我个人每天用的最多的查看命令虽然简单但避免了一堆“表不存在”的尴尬。3. 查看数据库、表与结构从一片空白到心里有数3.1 查看数据库列表SHOW DATABASES 背后的权限执行最简单的一条SHOW DATABASES;输出当前账号有权限访问的所有数据库。这里会有个新手疑问为什么里面有几个没用过的库比如information_schema、performance_schema、sys8.0 版本都有sys。这几个是系统库分别存放元数据、性能监控和诊断视图平时不需要动它们。普通业务库是test或者自定义名称。权限对SHOW DATABASES影响很大。用root能看到所有库普通账号只能看到授权库。如果你用 app 账号登录后“看不到某个库”第一反应不是库不存在而是账号没授权。验证方法SHOW GRANTS;这条命令能列出当前账号的权限明细排查权限和理解SHOW结果都很有用。想查看所有库的详细信息可以查information_schema.SCHEMATASELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME FROM information_schema.SCHEMATA;这样能看到库的字符集配置在做库迁移时非常实用。3.2 查看表结构和建表语句DESC 与 SHOW CREATE TABLE 配合使用选中一个库后查看库里的表SHOW TABLES;如果要看某张表的字段结构DESC users;或者全称写法SHOW COLUMNS FROM users;两种写法等价输出会列出字段名、类型、是否允许 NULL、键类型、默认值、额外信息比如自增。想精确查看主键、索引和建表时的完整定义推荐用SHOW CREATE TABLE users\G这里的\G在命令行里非常实用能把宽表结果纵向显示避免输出被折行。这条命令会返回完整的CREATE TABLE语句包括字段注释、字符集、引擎、索引、外键约束。很多人在开发环境用图形工具看结构上了生产环境只能命令行时最靠谱的“看结构”方式就是SHOW CREATE TABLE因为它就是 MySQL 内部存储的表定义原文。3.3 查看库表的数据量、大小用 information_schema 偷个懒数据库越来越大想快速知道哪张表最占空间、大概多少行可以查系统库的元数据。下面这条 SQL 是查某个库所有表的大致行数和数据大小SELECT TABLE_NAME, ENGINE, TABLE_ROWS, ROUND((DATA_LENGTH INDEX_LENGTH) / 1024 / 1024, 2) AS size_mb FROM information_schema.TABLES WHERE TABLE_SCHEMA yourdb ORDER BY size_mb DESC;注意TABLE_ROWS是优化器估算值对于 InnoDB 表不是精确行数尤其是频繁增删后偏差可能很大。精确行数该用COUNT(*)但大表执行COUNT(*)很耗时所以日常“看大小”用这个估算就够。实际排查磁盘空间时我通常会再配合系统命令du -sh查看数据目录不过那已经不属于 SQL 层面了。这个信息特别适合在决定是否清理历史表、是否做归档前使用。4. 查看业务数据SELECT 才是最高频的“查看”4.1 基本查询的安全姿势“查看数据”最终落到SELECT。入门级的SELECT * FROM users;但在生产环境我强烈建议不要这么干。一张表几十万行全表输出不仅容易卡住终端更会占用数据库的 IO、网络带宽和内存。查看业务数据的安全姿势是SELECT * FROM users WHERE status 1 LIMIT 20;加WHERE过滤核心条件加LIMIT限制返回条数。哪怕你知道表很小写查询时也顺手加个LIMIT这是职业习惯而不是 SQL 语法问题。当返回结果的字段很多垂直排版看着费劲时同样用\GSELECT * FROM users WHERE id 123\G一条记录占两列纵向展示字段多的时候比横向表格清晰得多。4.2 翻查数据时的三个高频套路更多时候你需要的不是SELECT *而是带着业务条件的“查看”。三个高频场景值得单独写一下。按时间或数值排序查看最新记录SELECT id, title, created_at FROM articles ORDER BY created_at DESC LIMIT 10;按某个维度统计“到底有多少”SELECT status, COUNT(*) AS cnt FROM orders GROUP BY status;多表关联查明细比如查看订单对应的用户和商品SELECT o.order_no, u.nickname, p.product_name FROM orders o JOIN users u ON o.user_id u.id JOIN products p ON o.product_id p.id WHERE o.pay_time 2025-01-01 LIMIT 20;很多人看到多表 JOIN 就头大实际拆解逻辑很简单先确定你要展示哪些字段再确定这些字段分别在哪些表然后用关联条件连接。JOIN本身就是一种“把多张表横着拼在一起查看”的操作。4.3 数据乱码时先查字符集查看业务数据时遇到中文乱码不要急着改表先用 2.2 节的方法查字符集。SHOW VARIABLES LIKE character_set%;最常见的乱码原因是character_set_client和character_set_server不一致。比如服务端是 utf8mb4客户端连接默认是 latin1中文字符进来就变成???。临时解决办法是SET NAMES utf8mb4;注意SET NAMES只影响当前会话重连后失效。如果是应用连接的乱码得去应用侧检查连接串里的characterEncoding配置而不是在 MySQL 客户端里手动改。5. 查看索引与 SQL 执行计划别等卡了才后悔5.1 SHOW INDEX FROM 看表上有哪些索引查询慢的时候第一反应不是优化 SQL 语句而是先看表上到底有哪些索引。命令SHOW INDEX FROM users;输出每一行对应一个索引字段重点看几个列Key_name索引名主键通常叫PRIMARY。Non_unique是否非唯一0 代表唯一索引。Seq_in_index联合索引中字段的顺序。Column_name列名。Cardinality索引基数表示该索引列有多少个不同的值。数值越小选择性越差索引价值越低。注意它是估算值不是精确值。Index_typeBTREE、FULLTEXT 或 HASH 等。联合索引的顺序非常关键SHOW INDEX FROM能帮你快速看出索引是不是“建错”了。比如你建了一个idx(a, b)但查询条件是where b 1 and a 2MySQL 会尝试调整顺序但如果是where b 1这个联合索引很可能无法发挥最大作用因为最左前缀原则限制。5.2 EXPLAIN 看 SQL 是怎么跑的索引只是静态信息真正执行时走不走索引、扫描多少行要看执行计划。在查询前加EXPLAINEXPLAIN SELECT * FROM orders WHERE user_id 100 ORDER BY create_time DESC;返回结果里最需要关注几列type访问类型从好到差大致是system、const、eq_ref、ref、range、index、ALL。出现ALL就是全表扫描大表上通常意味着性能隐患。key实际使用的索引名值是NULL就说明没走索引。rows估算扫描行数越小越好。Extra常见有Using index覆盖索引、Using filesort文件排序、Using temporary临时表。后两者是优化重点出现Using filesort时通常要考虑把排序字段放进索引里。举个真实例子某查询typeALL、rows200000手动在user_id上建完索引后typeref、rows50响应时间从秒级降到毫秒级。这就是“查看执行计划”的直接价值。我建议每一条线上慢查询的数据都先过一遍EXPLAIN再决定加索引还是改写 SQL。5.3 打开慢查询日志把“看不见的慢”变成“看得见”如果不知道哪些 SQL 慢那就要靠慢查询日志来帮助你“查看”。先查当前配置SHOW VARIABLES LIKE slow_query_log%; SHOW VARIABLES LIKE long_query_time;如果slow_query_log为OFF需要打开线上一般建议开启SET GLOBAL slow_query_log ON; SET GLOBAL long_query_time 2;long_query_time是阈值单位秒这里表示超过 2 秒的 SQL 会被记录。查看慢日志位置SHOW VARIABLES LIKE slow_query_log_file;然后到系统层面用文件命令查看日志也可以使用 MySQL 自带的统计工具mysqldumpslow -s t /var/lib/mysql/xxx-slow.log这个工具会把相似的慢 SQL 汇总后按耗时排序能很快找出最需要处理的 SQL。会看执行计划的同学再配合慢日志基本就能应对大部分性能排查场景。6. 查看用户、权限和连接状态排查权限问题的关键6.1 查看当前用户与权限权限问题几乎是新人每天都会遇到的。查看当前登录账号SELECT CURRENT_USER();查看当前账号的权限SHOW GRANTS;结果类似GRANT SELECT, INSERT, UPDATE ON dbname.* TO appuser%如果觉得自己权限比预期少可以查看指定用户的权限SHOW GRANTS FOR appuser%;注意用户主机必须完全匹配很多权限排查卡在 host 不一致上比如账号有appuserlocalhost但应用从远程 IP 连接匹配到的是另一个账号。如果需要查看 MySQL 系统表里所有用户SELECT user, host, plugin, authentication_string FROM mysql.user;authentication_string是加密后的密码摘要不是明文密码。所以我在这里特别强调MySQL 里无法直接“查看”用户的密码只能重置。遇到忘记 root 密码的情况正确做法是跳过授权表启动或者用ALTER USER重置而不是去查什么表。6.2 查看连接与线程SHOW PROCESSLIST 现场抓鬼当系统卡死或某条查询长时间不返回就轮到SHOW FULL PROCESSLIST;这个命令会列出当前所有连接线程包括Id、User、Host、db、Command、Time、State、Info。重点看State和InfoState: Sending data通常是正在执行查询如果时间很长再看 SQL 是不是全表扫描。State: Waiting for table metadata lock多数是 DDL 和 DML 相互阻塞了。Command: Sleep表示空闲连接大量空闲会占满连接数。看到有问题的线程时可以用KILL 12345;12345换成Id。这是 DBA 的“现场抓鬼”命令非常实用。用SHOW PROCESSLIST能看到当前正在执行的 SQL 原文配合EXPLAIN就能定位慢查询。6.3 连接数是不是满了看这两个变量应用报“Too many connections”时先查上限SHOW VARIABLES LIKE max_connections;再查当前连接数SHOW STATUS LIKE Threads_connected;如果当前连接数已经逼近上限说明连接池配置或者应用释放连接的逻辑有问题。还可以查看SHOW STATUS LIKE Max_used_connections;这是历史最高连接数用来评估你的业务峰值。实际排查中Threads_connected高但Threads_running不高通常说明有大量空闲连接撑满了连接池如果Threads_running同时很高说明并发 SQL 有问题需要从 SQL 和执行计划入手。7. 查看系统日志和 InnoDB 状态疑难杂症时的最后一道防线7.1 错误日志、通用日志、二进制日志怎么查看“数据库怎么起不来”“某个连接为什么被断开”这类问题查日志比查任何工具都直接。MySQL 错误日志路径SHOW VARIABLES LIKE log_error;日志可能是stderr或具体文件路径然后用系统命令less、tail查看tail -n 200 /var/log/mysql/error.log通用日志会记录所有客户端发送的语句平时默认关闭因为影响性能。排查应用到底发了什么 SQL 时可临时开启SHOW VARIABLES LIKE general_log%; SET GLOBAL general_log ON;二进制日志主要用于复制和数据恢复。查看是否开启SHOW VARIABLES LIKE log_bin;查看当前有哪些 binlog 文件SHOW BINARY LOGS;查看某个 binlog 里的事件如果你有复现权限SHOW BINLOG EVENTS IN mysql-bin.000001 LIMIT 20;对于大多数“查看”需求知道 binlog 是否开启和文件列表就够了深入解析 binlog 通常需要专门的工具。7.2 SHOW ENGINE INNODB STATUS 和状态变量InnoDB 引擎的内部状态可以用SHOW ENGINE INNODB STATUS\G输出很长重点看几个段落LATEST DETECTED DEADLOCK最近一次死锁信息TRANSACTIONS当前事务状态BUFFER POOL AND MEMORY缓冲池命中情况。死锁问题在开发环境很少见线上偶发时这个命令可以让我拿到“案发现场”的事务和锁记录。还可以用全局状态变量看引擎运行指标SHOW GLOBAL STATUS LIKE Innodb_row_lock%;查看锁等待情况。SHOW GLOBAL STATUS LIKE Innodb_buffer_pool%;查看缓冲池相关指标。状态变量很多很杂没必要全记住。我个人的方法是遇到具体问题先定位关键词再用SHOW GLOBAL STATUS LIKE去过滤。比如怀疑缓冲池命中率低就查Innodb_buffer_pool_read_requests和Innodb_buffer_pool_reads两个值一对比就能算出命中率。8. 查看操作实战速查表与练习路线8.1 遇到这些“看不到”的问题先查这些把新手最常见的“看不到”问题和对应的排查命令整理成一张表方便直接抄作业现象查看/排查命令说明看不到某个库SHOW GRANTS;先查权限再确认库是否存在提示表不存在SELECT DATABASE();确认是否选中库或大小写问题连接不上数据库SHOW VARIABLES LIKE port;确认端口、防火墙、账号 host中文乱码SHOW VARIABLES LIKE character_set%;查字符集必要时SET NAMES utf8mb4查询特别慢EXPLAIN SELECT ...;看执行计划定位全表扫描或排序连接数打满SHOW STATUS LIKE Threads_connected;对比max_connections表占用空间大SELECT ... FROM information_schema.TABLES;按库查表大小、估算行数忘记 root 密码无查看命令只能通过重置密码解决服务起不来SHOW VARIABLES LIKE log_error;查错误日志当前用的是哪个库SELECT DATABASE();确认连接上下文这张表对开发人员日常排查非常够用。所有“查看”操作的本质是先找到对应的系统表或变量再结合上下文验证。8.2 我整理的一条“查看”练习路线如果你是刚接触 MySQL 的开发者与其零散背命令不如按一条路线在本地实例上完整走一遍安装一个 MySQL 5.7 或 8.0启动后用mysql -u root -p登录。依次执行SHOW DATABASES;、SELECT DATABASE();、USE mysql;、SHOW TABLES;。对任意一张表执行DESC和SHOW CREATE TABLE把字段类型和索引理解清楚。用SELECT ... LIMIT 10实际查几条数据再加WHERE、ORDER BY、GROUP BY。对查询语句执行EXPLAIN观察type和key的变化。执行SHOW PROCESSLIST和SHOW STATUS体会“运行时信息”和“元数据信息”的区别。最后试一下SHOW VARIABLES里的端口、字符集、数据目录几项把 MySQL 的“配置文件”从命令行里翻出来。这套路线走完几乎所有“mysql怎么查看”的常见场景你就都覆盖到了。之后再遇到陌生的查看需求先想清楚“我要看的是版本、库表、数据还是状态”然后直接用对应的SHOW或SELECT不会大方向出错。我个人平时最常用的并不是某个冷门命令而是SHOW PROCESSLIST和EXPLAIN这两个。有一次线上反馈“系统很慢”我没急着改配置先SHOW PROCESSLIST看到几十条相同的全表查询在排队再EXPLAIN确认走了ALL加完索引后系统立刻恢复正常。这种“先查看、再定位、最后动手”的习惯比任何图形化工具都稳妥。所以如果你现在还在为“MySQL 怎么查看”发愁不必追求把每条命令背下来先按上面的路线走一遍下次遇到问题你自然会知道从哪里看起。