-
MySQL 直方图用于补充非均匀分布列的选择性估计。本文用 ANALYZE TABLE 配置桶数,从 COLUMN_STATISTICS 检查采样与更新时间,再用 EXPLAIN 对照实际行数并给出安全回退方法。
-
Redis Stream 消费组的消息长时间未确认时,先用 XPENDING 判断空闲时间,再用 XAUTOCLAIM 分页接管,完成幂等业务后用 XACK 结束消息生命周期。
-
Redis EXPIRETIME 返回键的绝对过期 Unix 时间戳,适合核对 EXPIRE 与 PEXPIREAT 写入的最终时间。文章用 TTL、PEXPIRETIME 和服务器时间对照,排查秒毫秒混用、时钟偏差、无过期键和恢复后的判断错误。
-
Redis ZSet 适合按时间分拣延迟任务,但先用 ZRANGEBYSCORE 读取、再用 ZREM 删除会留下并发抢占窗口。本文从两个 worker 同时取到同一 job_id 的现场出发,说明如何用 Lua 把筛选与删除放进一次原子操作,并保留重复执行与故障恢复边界。
-
Redis XREADGROUP 读不到新消息时,先区分 >、数字 ID 与 BLOCK 的职责:前者选择组的新消息或当前消费者的 pending 历史,BLOCK 只控制等待时间。本文再用 XPENDING、XACK 和 XAUTOCLAIM 排查确认与故障接管。
-
MySQL 8.4 的资源组可以把线程或单条 SQL 放进指定 CPU 资源边界,适合给报表、后台批处理和在线请求做隔离。本文用 RESOURCE_GROUP 语句与 RESOURCE_GROUP 优化器提示演示创建、绑定、检查和回滚,并说明权限与线程范围的限制。
-
Redis Cluster 返回 MOVED 或 ASK 时,客户端都需要重定向,但两者代表的槽位状态并不相同。本文用槽位迁移现场拆开路由缓存、ASKING、重试次数和故障排查边界,帮助判断哪些响应可以自动跟随、哪些情况应该先查集群状态。
-
Redis AOF 重写时磁盘占用变大,通常不是数据瞬间翻倍,而是旧 AOF、新 base 文件和重写期间新增写入同时存在。本文用 Redis 7 多段 AOF 结构、INFO persistence、du 与 df 命令定位空间峰值,并给出生产容量检查清单。
-
MySQL 递归 CTE 的安全做法不是盲目调大上限,而是先写清终止条件,再按单次查询设置 cte_max_recursion_depth,并用执行时间、行数和结果边界复查。
-
CTE可不是万能的语法糖,其是否适用取决于复用性、逻辑复杂度以及数据库的物化策略。只有在同一子查询被引用不少于2次、包含聚合/窗口/多表JOIN、嵌套超过2层且语义清晰、需要递归处理的情况下,才建议使用CTE。在命名CTE时,必须显式声明列,以避免SELECT*和同名列冲突。MySQL 8.0+默认
-
MySQL EXPLAIN ANALYZE 中的 loops 表示迭代器实际执行次数。本文结合 rows、actual time 和嵌套循环 JOIN,说明如何读懂它并定位估算偏差。
-
MySQL 查询不走索引,常见原因不是索引不存在,而是 SQL 写法让优化器难以利用索引。函数包列、隐式类型转换、范围过宽和联合索引顺序不匹配,都应该用 EXPLAIN 验证后再改写。
-
Redis ZSET 分页出现漏数据,通常不是 Redis 丢了记录,而是分页游标只保存 score、同分值记录缺少 member 边界,或翻页期间集合发生变化。本文用一组可复现命令拆开排序规则、游标设计和上线检查。
-
给一个需要同时写入多个 Redis 字符串键的初始化场景,说明 MSETNX 为什么能做到全成全败、返回 0 时如何定位已存在键,以及单机原子语义在集群多键操作中的边界。
-
为啥JSON_CONTAINS查不到数组值?关键在于字段是不是JSON类型,以及路径有没有写'$[*]'。一定要确保字段是JSON类型,并且明确指定路径,比如JSON_CONTAINS(col, "val", '$[*]'),如果是数字,就不需要引号啦。JSON_CONTAINS 查不到数组里的值?