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助手,依托大模型,帮助用户记录、整理和分析音视频内容,体验用大模型做音视频笔记、整理会议记录。
相关推荐
23471021272 小时前
4.21 学习笔记weixin_408099672 小时前
OCR + 自动翻译:跨境电商批量铺货方案(支持多语言自动识别)zxrhhm2 小时前
Oracle RAC 日常监控脚本江山与紫云2 小时前
1.2 配置开发环境(VS Code / PyCharm)Keep Running *2 小时前
Python基础_学习笔记汽车芯猿2 小时前
嵌入式固件内存占用分析利器:Python实现S19/HEX地址空间可视化工具m0_748920362 小时前
Redis怎样防止主从节点淘汰行为不一致misL NITL2 小时前
数据库操作与数据管理——Rust 与 SQLite 的集成2401_835956812 小时前
SQL中如何查找特定的空值行:WHERE IS NULL深度解析