普通用户只需对目标表拥有select权限即可执行show index from,无需information_schema查询权限;但必须显式授予表级select权限(如grant select on db.t1),数据库级授权不足,且需注意use数据库或指定库名、表名大小写敏感。

普通用户执行 SHOW INDEX FROM 需要什么权限
只要对目标表有 SELECT 权限,就能执行 SHOW INDEX FROM。它不依赖 INFORMATION_SCHEMA 的查询权限,也不需要 SHOW VIEW 或 PROCESS 等高危权限——这是 MySQL 的设计特性,方便低权限用户自查索引结构。
常见错误现象:ERROR 1146 (42S02): Table 'xxx' doesn't exist,这通常不是权限问题,而是没指定数据库或当前库不对。
- 必须先
USE db_name,或在语句中显式写SHOW INDEX FROM table_name FROM db_name - 表名大小写敏感(Linux 系统下),
SHOW INDEX FROM User和SHOW INDEX FROM user可能指向不同表 -
SELECT权限需授予具体表,不能只给数据库级(如GRANT SELECT ON mydb.*不足以让其查mydb.t1的索引,除非明确授GRANT SELECT ON mydb.t1)
为什么不能只靠 GRANT SELECT ON db.table
看起来够了,但实际不够:MySQL 的 SELECT 权限控制的是“能否读取行数据”,而 SHOW INDEX 是元数据操作,它底层仍需访问表定义。从 MySQL 8.0.16 起,严格模式下若未显式授予表级 SELECT,即使有数据库级权限,SHOW INDEX 也可能失败(报错 Access denied)。
- 安全起见,授权必须精确到表:
GRANT SELECT ON mydb.users TO 'appuser'@'%' - 如果用户需查多个表,逐个授权比授库级更可控;批量授权可用脚本生成语句,避免误开
mydb.* - 注意主机名匹配:
'appuser'@'localhost'和'appuser'@'%'是两个不同账号,权限不互通
想用 INFORMATION_SCHEMA.STATISTICS 查索引怎么办
这条路权限要求更高:SELECT 权限必须覆盖 INFORMATION_SCHEMA.STATISTICS 表本身(MySQL 默认禁止普通用户查该表),或授予 SELECT 权限时加 WITH GRANT OPTION——但后者极不推荐,属于权限越界。
- 绝大多数场景无需走这条路;
SHOW INDEX FROM已包含全部关键字段(Key_name、Column_name、Seq_in_index、Index_type、Cardinality) - 若真需跨库扫描索引(如 DBA 写巡检脚本),应创建专用运维账号,而非开放给应用用户
- 强行授
SELECT ON INFORMATION_SCHEMA.*在 MySQL 8.0+ 会被拒绝,且 RDS(如阿里云、腾讯云)直接禁用该操作
验证授权是否生效的最快方式
别等应用出错才排查。登录目标用户账号后,直接执行一条最小化命令:
SHOW INDEX FROM t LIMIT 1;
成功返回结果即表示权限到位;若报错,重点看错误码:
-
ERROR 1146→ 库/表名错误或未USE -
ERROR 1142(SELECT command denied)→ 权限未授予该表,检查SHOW GRANTS FOR 'user'@'host' -
ERROR 1227(access denied for operation SHOW INDEX)→ 极少见,多见于旧版 MySQL 或自定义安全插件拦截
真正容易被忽略的是:权限变更后,连接未重连。MySQL 不自动刷新权限缓存,必须执行 FLUSH PRIVILEGES(仅限管理员),或让用户断开重连——这点在连接池场景下尤其关键。











