phpmyadmin用户列表卡在“loading…”通常是mysql.user表未建索引导致全表扫描,mysql 8.0+因caching_sha2_password插件使该表变大且无索引,查询变慢;应为user、host字段创建myisam索引并确保账号具备select on mysql.user权限。
phpmyadmin 用户列表卡在“loading…”:通常是 mysql.user 表查询没走索引
phpmyadmin 加载用户列表时,底层执行的是对 mysql.user 表的全字段 select 查询。mysql 8.0+ 默认启用了 caching_sha2_password 认证插件,导致该表变大(尤其有几十个以上用户时),而官方未为关键字段建索引,查询就会慢成加载动画一直转。
- 检查是否真卡在这里:
SHOW PROCESSLIST;看是否有长时间运行的SELECT * FROM mysql.user - 确认表大小:
SELECT COUNT(*) FROM mysql.user;,超过 50 行就值得优化 - 别直接改
mysql.user结构——它是系统表,ALTER 可能被拒绝或引发权限异常
给 mysql.user 添加复合索引前,先验证 MySQL 版本和存储引擎
MySQL 5.7 使用 MyISAM 引擎,8.0+ 默认是 InnoDB,但 mysql 系统库下的表仍强制为 MyISAM(即使你设了默认引擎)。这意味着不能用标准 ALTER TABLE ... ADD INDEX,必须用 CREATE INDEX 且仅限某些字段组合。
- 查引擎:
SELECT ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA='mysql' AND TABLE_NAME='user';—— 大概率返回MyISAM - MyISAM 允许对
User,Host字段建索引,但对plugin或authentication_string建索引会失败 - 实操命令(仅适用于 MyISAM):
CREATE INDEX idx_user_host ON mysql.user (User, Host); - 执行后重启 MySQL 服务才生效(MyISAM 索引不热加载)
权限不足导致 phpMyAdmin 无法读取用户列表的常见表现
不是所有账号都能 SELECT mysql.user。如果你用的是低权限账号登录 phpMyAdmin(比如只给了某个数据库的 SELECT 权限),页面会显示空列表或报错 #1142 - SELECT command denied to user,而不是加载中。
- 检查当前用户权限:
SHOW GRANTS FOR CURRENT_USER; - 必要权限至少含:
SELECT ON mysql.user和SELECT ON mysql.db(用户列表页也会查 db 表做权限映射) - 临时授权(生产环境慎用):
GRANT SELECT ON mysql.user TO 'your_user'@'%'; FLUSH PRIVILEGES; - 注意:phpMyAdmin 7.0+ 在无足够权限时会静默降级显示,不报错也不加载,容易误判为性能问题
phpMyAdmin 配置里关掉“显示用户全局权限”能跳过慢查询
phpMyAdmin 默认在用户列表页右侧显示每个用户的全局权限(如 SELECT, INSERT 等),这需要 JOIN mysql.user 和 mysql.db,再做字符串拼接,是主要拖慢原因。
- 编辑
config.inc.php,加一行:$cfg['Servers'][$i]['ShowUsers'] = false; - 或者更精准地禁用权限列:
$cfg['Servers'][$i]['ShowUsersColumns'] = ['User', 'Host']; - 这个配置不会影响实际权限,只是前端不查、不展示那些字段,响应从秒级降到毫秒级
- 副作用:你再也看不到“该用户有没有 DROP 权限”这种信息,得手动查
SELECT User,Host,Select_priv,Drop_priv FROM mysql.user;
真正卡住的时候,优先看 mysql.user 的索引和当前账号权限,而不是调优 phpMyAdmin 的 PHP 设置——那解决不了根本的 SQL 查询瓶颈。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











