在主服务器上创建用户并授权,权限会自动同步到只读副本。
在MySQL数据库管理中,创建一个高性能的只读用户不仅仅是执行几条简单的授权命令,更涉及到资源管控、安全策略以及架构层面的读写分离配合,核心的操作步骤是使用CREATE USER命令建立账户,并通过GRANT SELECT限制其仅具备查询权限,同时建议配合MAX_USER_CONNECTIONS参数来防止连接数耗尽,具体的标准SQL语句如下:首先创建用户并指定密码插件,例如CREATE USER 'readonly_user'@'%' IDENTIFIED BY 'strong_password';,接着授予查询权限并限制最大连接数,如GRANT SELECT ON database_name.* TO 'readonly_user'@'%' WITH MAX_USER_CONNECTIONS 50;,最后执行FLUSH PRIVILEGES;刷新权限,要真正实现“高性能”,还需要在账户隔离、连接复用以及查询路由上进行深度优化。

基础只读账户的标准化创建流程
构建高性能只读环境的第一步是规范化的账户创建,在生产环境中,避免直接使用root用户或拥有超级权限的账户进行业务读取,这是保障数据库安全与稳定的基本底线。
创建用户时,应明确指定主机范围,如果业务服务器IP固定,尽量不要使用通配符,而是指定具体的IP段或内网网段,这能大幅降低被暴力破解的风险。CREATE USER 'app_readonly'@'192.168.1.%' IDENTIFIED BY 'ComplexPassword123!';。
在授权阶段,除了基础的SELECT权限外,通常还需要授予SHOW DATABASES和PROCESS权限(视具体监控需求而定),以便应用层能够进行基本的健康检查,对于大多数业务场景,权限范围应限定在特定的数据库而非全局,即使用GRANT SELECT ON app_production.* TO 'app_readonly'@'192.168.1.%';,这种最小权限原则不仅符合安全规范,也能在逻辑上隔离不同业务的数据访问边界。
资源管控:防止只读用户拖垮数据库
这是实现“高性能”用户配置的关键环节,很多时候,只读业务(如报表生成、大屏展示)往往会执行非常消耗资源的复杂查询,如果不对只读用户进行资源限制,几个慢查询就能占满CPU和I/O资源,导致核心的写入业务受阻。
MySQL提供了非常实用的资源限制参数,可以在授权时通过WITH子句指定,最常用的是MAX_USER_CONNECTIONS,它限制了该用户同时建立的最大连接数,设置WITH MAX_USER_CONNECTIONS 20,可以防止单个应用因连接池配置错误或代码Bug导致瞬间创建数百个连接,把数据库连接池占满。
还可以利用MAX_QUERIES_PER_HOUR、MAX_UPDATES_PER_HOUR(虽然只读用户不应有更新,但作为双重保险)以及MAX_STATEMENT_TIME(MySQL 5.7+)来控制查询行为,特别是MAX_STATEMENT_TIME,可以强制终止运行时间超过N毫秒的查询,这对于防止失控的长查询至关重要,设置只读查询最大执行时间为5秒,超过则自动断开,能有效保护系统整体响应速度。
认证插件的选择与连接性能
在MySQL 8.0及以上版本中,默认的认证插件是caching_sha2_password,相比旧版的mysql_native_password,它提供了更高的安全性,但在某些高并发短连接场景下,由于需要进行额外的RSA密钥交换握手,可能会带来微小的性能损耗。

为了优化连接性能,建议应用端优先使用连接池技术(如Druid, HikariCP等),将连接复用,从而减少握手认证的开销,如果必须使用原生密码认证以兼容老旧系统,可以在创建用户时指定插件:CREATE USER 'readonly_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';,但在大多数现代高性能架构中,保持默认的caching_sha2_password并配合高效的连接池是更优的选择,因为它在安全性和性能之间取得了最佳平衡,且支持SSL加密传输,防止数据在网络层被嗅探。
读写分离架构下的用户策略
在真正的高性能架构中,只读用户通常不应该指向主库,主库承担着所有的写入压力,其计算资源和I/O资源极其宝贵,创建只读用户的最终目的,往往是为了配合读写分离中间件(如MySQL Router, ProxySQL, ShardingSphere或MyCat)。
在这种架构下,我们创建的只读账户通常配置在从库上,专业的解决方案是:在主库上创建该用户后,通过主从复制同步到所有从库,在中间件配置中,定义该用户为“只读角色”,强制其流量路由到从库节点群。
这里有一个独立的见解:延迟感知的只读用户,对于强一致性要求的业务,普通的只读用户可能会因为主从复制延迟而读取到旧数据,解决方案是配置两个只读账户:一个是default_read,路由到从库,承担大部分流量;另一个是sync_read,配置中间件在检测到关键事务后,强制路由到主库或开启“session read after write”策略,这种精细化的用户分级策略,是提升业务体验的高级手段。
利用视图优化查询性能与权限
为了进一步提升只读用户的查询效率并简化业务逻辑,可以专门为只读用户创建视图,视图不仅起到了数据掩码的作用(隐藏敏感字段),还能预计算部分逻辑。
对于复杂的统计查询,可以在数据库端创建一个物化视图或常规视图,并将该视图的SELECT权限授予只读用户,而不是授予基础表的权限,这样,应用端只需执行简单的SELECT * FROM v_report_summary;,复杂的计算逻辑在数据库定义层完成,这不仅减少了网络传输的数据量,也避免了应用层编写低效的SQL,通过视图封装,DBA可以在不修改应用代码的情况下,优化底层的SQL执行计划,从而实现性能的透明提升。
监控与维护
创建用户并非一劳永逸,利用performance_schema可以监控只读用户的活动情况,通过查询performance_schema.threads和performance_schema.events_statements_summary_by_user,可以分析出哪些只读查询最耗时,哪些只读用户占用了最多的CPU。

定期审查只读账户的权限也是必要的,如果业务逻辑变更,某些账户可能不再需要访问某些表,应及时回收权限,对于长期未活跃的只读账户,应考虑冻结或删除,以减少攻击面。
高性能MySQL只读用户的创建是一个融合了安全配置、资源治理和架构优化的系统工程,通过限制连接数、配合读写分离、利用视图封装以及精细化监控,我们不仅能获得一个安全的查询入口,更能确保数据库在高并发压力下的稳定运行。
您在当前的数据库运维中,是否遇到过因为只读查询引发的主库CPU飙升问题?欢迎在评论区分享您的排查思路或解决方案。
小伙伴们,上文介绍高性能mysql只读创建用户的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/94458.html