mysql.user表查得慢是因为权限检查时隐式联查多张权限表且缺乏有效索引,导致全表扫描;MySQL 5.7及以前无缓存,8.0+虽有缓存但仅在FLUSH PRIVILEGES或DDL后重建,非实时更新。mysql.user 表为什么查得慢?直接查 mysql.user 表本身不慢,慢的是每次执行权限检查时隐式触发的多表联查和元数据扫描。MySQL 在用户登录、执行语句、访问数据库对象前,会动态拼接查询去 mysql.user、mysql.db、mysql.tables_priv 等表里捞权限,这些表默认没建有效索引,且 InnoDB 引擎下全表扫描开销明显。常见错误现象:SHOW GRANTS FOR 'u'@'h' 延迟高;新建用户后首次登录卡顿;大量并发连接时 Performance_schema.threads 显示大量线程卡在 checking permissions 状态。MySQL 8.0+ 默认用缓存加速权限检查,但缓存只在用户权限变更(如 FLUSH PRIVILEGES 或 DDL)后重建,不是实时更新mysql.user 表主键是 (Host,User),但权限检查常按 User 单独查,或带通配符 Host(如 '%'),导致索引失效MySQL 5.7 及更早版本无权限缓存,每次检查都走磁盘表,压力更大FLUSH PRIVILEGES 到底要不要执行?绝大多数情况不用------而且不该随便执行。它强制清空权限缓存并重载所有权限表,会阻塞后续所有权限检查请求,造成瞬时雪崩。使用场景仅限两种:UPDATE/INSERT/DELETE 直接改了 mysql 库下的权限表(绕过 GRANT/REVOKE);或确认缓存已损坏(比如改完权限但行为没变,且确定没用 GRANT)。用 GRANT、REVOKE、CREATE USER 等 DDL 修改权限,MySQL 自动更新缓存,无需 FLUSH PRIVILEGES执行 FLUSH PRIVILEGES 后,所有活跃连接的权限不会立即刷新,新连接才生效;已有连接仍用旧缓存,直到下次权限检查点MySQL 8.0+ 的缓存结构更复杂,包含角色继承、密码策略等,FLUSH PRIVILEGES 还可能触发额外校验,耗时更长如何验证权限缓存是否生效?看 performance_schema 里的计数器最直接。缓存命中高,说明系统没频繁回表查权限表。 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手,依托大模型,帮助用户记录、整理和分析音视频内容,体验用大模型做音视频笔记、整理会议记录。
相关推荐
金銀銅鐵2 小时前
[Python] 模 n 乘法的逆元计算器aqi002 小时前
15天学会AI应用开发(十)把文本嵌入模型换成国产模型吃糖的小孩4 小时前
给 QQ AI 机器人设计“可控记忆”:会话摘要、手动长期记忆与角色卡边界金銀銅鐵19 小时前
[Python] 扩展欧几里得算法Duckdblab19 小时前
DuckDB 性能调优终极指南:打造闪电般的分析体验带派擂总20 小时前
Python全栈开发精华版最全合集(包含各种面试题) Day24_异常和错误笃行3501 天前
金仓数据库数据安全双防线:静态存储加密与传输加密实战笃行3501 天前
金仓数据库物理备份实战:sys_rman 全流程演练与误覆盖抢救笃行3501 天前
金仓数据库逻辑备份实战:从全库导出到 Schema 替换的完整闭环