2022/12/16

后端接口设计:先把幂等、分页和错误码定下来

接口设计最怕的是每个开发者各写一套:有人用 code: 0 表示成功,有人用 code: 200;有人分页从 1 开始,有人从 0 开始。等前端接了十几个接口才发现规律不一致,返工成本极高。这篇整理三个最值得在项目初期就定死…

  • 后端
  • 2022/12/16
  • 3
  • 2022/12/10

    联合索引的最左前缀与覆盖索引:一次讲清楚

    联合索引的规则说起来就一句“最左前缀”,但为什么是这样、什么情况下会失效、覆盖索引又怎么省掉回表,值得用具体的例子走一遍。 B+ 树里到底按什么排序 CREATE INDEX idx_abc ON t (a, b, c); 这棵索引树按 a 排…

  • 数据库
  • 2022/12/10
  • 4
  • 2022/7/9

    InnoDB 事务隔离级别:把幻读这件事实测一遍

    隔离级别这四个字背了很多年,但真正理解 RR(可重复读)是怎么“看起来”解决幻读的,还是自己开两个会话做实验之后。 准备 CREATE TABLE t (id INT PRIMARY KEY, v INT, KEY idx_v(v)) ENGINE=InnoDB; INSERT INTO …

  • 数据库
  • 2022/7/9
  • 4
  • 2022/6/11

    Redis 分布式锁:三种实现和它们各自的坑

    单机用 threading.Lock 就够了,多实例部署就必须上分布式锁。Redis 是最常见的方案,但实现细节差一点,可靠性差很多。 第一版:SETNX + DEL if redis.setnx(key, 1): try: do_something() finall…

  • 中间件
  • 2022/6/11
  • 4
  • 2022/4/9

    一次慢查询排查:从慢日志到改写 SQL

    有天下午开始,列表页偶尔要等五六秒才出来。不是一直慢,是“偶尔”,这种最难查。 先打开慢日志 SET GLOBAL slow_query_log = ON; SET GLOBAL long_query_time = 1; SHOW VARIABLES LIKE 'slow_query_log_file'; …

  • 数据库
  • 2022/4/9
  • 4
  • 2022/3/6

    缓存穿透、击穿、雪崩:三种问题三种解法

    这三个词经常被混着说,但成因完全不同,处理方式也不一样。分清楚之后,线上出事才知道该动哪里。 穿透:查一个根本不存在的数据 请求带着不存在的 id 打进来,缓存没有,落到数据库也没有,于是每次请求都穿透到 …

  • 中间件
  • 2022/3/6
  • 4
  • 2022/1/8

    MySQL 索引失效的六种常见写法

    建了索引却还在全表扫描,是日常开发里最常见的困惑。这篇把线上真实遇到过的几种情况整理一下,都不是玄学,都有明确原因。 一、列上套了函数或运算 -- 走不了索引 SELECT * FROM orders WHERE DATE(created_at) =…

  • 数据库
  • 2022/1/8
  • 6