MySQL Too many connections 报错后的排查思路
从应急处理到长期修复,整理一次线上连接数打满的完整排查过程。
支持通配符SSL证书、多域名证书、IP证书。适配ACME接口, 支持Zerossl、Let's Encrypt和Google等渠道。登录已有账号
2026-06-30 12:00:36 MySQL CASE WHEN SQL技巧
搞统计或者做报表的时候,经常需要把一些编码转成可读的文本,比如性别字段存的是0和1,显示的时候得变成男和女。这种场景直接用CASE WHEN就够了,比连表查字典轻便很多。
写法大概是这样的:
SELECT name, CASE sex WHEN 1 THEN '男' ELSE '女' END AS sex_description FROM score;
这就是简单CASE函数的用法:CASE后面跟字段,WHEN后面跟具体值,匹配上就返回THEN后面的结果,都没匹配上就走ELSE。如果不写ELSE,默认就是NULL。
不过简单CASE只能做等值判断。要按条件范围来,比如根据分数打等级,就得用另一种写法——条件表达式CASE。
SELECT name, score, CASE WHEN score >= 90 THEN '优秀' WHEN score >= 80 THEN '良好' WHEN score >= 60 THEN '及格' ELSE '不及格' END AS level FROM score;
这种是CASE后面不跟字段,直接WHEN写条件,条件是按顺序评估的,命中一个就停,所以分数>=90的不会掉到下一个WHEN去。
这两种写法大部分情况下可以互换,但条件复杂的时候只能用第二种。
统计聚合的时候CASE也很好用。比如想在一个查询里同时数出男生和女生的人数,不用分开写两条SQL,一条就行:
SELECT SUM(CASE WHEN STU_SEX = 0 THEN 1 ELSE 0 END) AS MALE_COUNT, SUM(CASE WHEN STU_SEX = 1 THEN 1 ELSE 0 END) AS FEMALE_COUNT FROM students;
这里其实就容易踩一个坑:THEN和ELSE返回的类型不一致。比如上面返回的是数字1和0,没问题,但如果一个分支返回字符串,另一个分支返回数字,有些MySQL版本或者严格模式下就会报类型转换错误,或者悄无声息转了,性能也会降。所以各个分支的结果类型尽量统一,至少是相近的。
NULL处理是另一个容易忽略的点。
CASE WHEN本身对NULL的判断要用WHEN ... IS NULL,直接WHEN NULL = ...是匹配不到的。如果字段可能是NULL,需要单独处理,或者配合IFNULL、COALESCE先兜底。
动态选列的场合也能用CASE WHEN,比如根据语言参数决定显示英文名还是中文名。
不过这种写法容易让SQL变得很长,后续维护的人看得头疼,建议在应用层处理会更清晰。
还有一个线上经验:在WHERE条件里写CASE WHEN要小心,大概率会让索引失效,导致全表扫描。以前试过在WHERE里根据参数动态选条件,写了个CASE,结果慢查询马上就上来了。排查下来就是优化器放弃了索引。
所以如果是在WHERE里做条件分支,尽量用AND/OR展开,别依赖CASE。
嵌套太多层也不推荐。虽然功能上能做,但过两个月再看自己写的SQL,可能得花好一会儿才能理清逻辑。两三层的CASE还算可控,再深的话考虑拆成多步查询或者用临时表。
除了上述场景,平时做数据转换、根据多个条件打标签,CASE WHEN基本就是最直接的方案。
掌握这两种语法,注意一下类型、NULL和索引这些细节,大部分需求都能应付了。
从应急处理到长期修复,整理一次线上连接数打满的完整排查过程。
LEFT()函数的常见用法、边界情况,以及和其他截取函数的简单对比,顺便聊聊线上可能踩的坑。
MySQL数据库出现“Too many connections”错误,通常意味着连接数已达上限。本文将深入剖析该问题的排查步骤,包括如何查看当前连接数和详细信息。并提供一系列解决方案:从调整max_connections、设置空闲连接超时、检查应用层连接泄漏,到监控优化连接,以及修改配置后重启服务。附带PHP示例,助你有效管理数据库连接,彻底解决连接瓶颈。
本文将深入探讨MySQL中DATETIME类型的全方位操作。从精确到秒级的时间存储机制,到字段规范定义、高效数据插入方法,再到灵活的格式化输出技巧,我们为您提供一套完整的实践方案。同时,详细解析开发中常见的时间偏移、时分秒丢失等问题及其规避策略,助您构建健壮的时间数据处理系统。
MySQL身份验证机制经历了从基础密码认证到插件化架构的演进,8.0版本默认采用的caching_sha2_password插件通过加盐哈希、迭代计算和双模式认证显著提升了安全性。对于传输层安全,SSL证书认证提供了端到端的加密保护。实际部署中需综合考虑兼容性与安全性,建议新系统优先使用caching_sha2_password插件并配置SSL,遗留系统可临时采用mysql_native_password插件过渡。通过密码策略强化、审计日志配置和多因素认证集成,可构建多层次的数据库安全防护体系。