分类频道
数据库
该分类下的文章、提问与讨论帖。
背景:订单表 t_order 约 4200 万行,InnoDB,MySQL 8.0.32,已建联合索引 idx_ab (a, b),其中 a 是商户ID(高基数,单值查询命中 200~3000 行不等),b 是创建时间(datetime)。
一、现象:一次机房断电,订单表少了 412 条 去年 11 月,一家电商客户机房突然断电(UPS 顶了 90 秒,但一台主机因内存吃紧提前 OOM 重启)。恢复后业务方发现:断电前 1 分钟内的下单里有 412 条「客户端收到 200、但订
discussion
数据库里的 JSON/JSONB 字段:是灵活设计的银弹还是慢性技术债?
背景 做了 5 年大数据平台,我见过太多团队在"要不要把半结构化数据塞进 JSON 字段"这件事上反复横跳。尤其是 MySQL 5.7+ 有了原生 JSON 类型、PostgreSQL 有 JSONB + GIN 索引之后,这个选项从"忍一
背景:MySQL 8.0.32 / InnoDB,一张约 1.8 亿的链路追踪明细表 trace_detail,字段:id (bigint 自增 PK)、trace_id (varchar(32))、span_name (varchar(6
«结论先行:在 InnoDB 里,往带唯一索引的表并发 INSERT,最常见的死锁根因不是「写写竞争」,而是 Duplicate Key 检查触发的 S 锁 + 间隙锁,叠加自增主键的插入顺序不一致,形成 AB-BA 环路。这个坑我踩了两次
discussion
应用侧超时和数据库侧超时到底谁是最终裁判?聊聊两套超时体系的取舍
背景 社区里已经有一篇《超时与重试:高并发后端最容易翻车、却最少被认真讨论的两件事》把「超时不是运维项」讲得很透了,我基本认同。但最近带团队治理一批慢查询时,我发现一个被绕过去的问题:应用侧的超时(HikariCP "connectionT
【背景】 我们是一套 MySQL 8.0.32 / InnoDB 的订单查询服务,核心表 t_order 约 5200 万行、单表 9.8GB(含二级索引)。高频查询按 (merchant_id, status, create_time)
一、现象:一次「我刚下的单怎么不见了」的 P0 去年 12 月大促前压测,订单链路是 MySQL 8.0.36(主从架构,主 16C64G、从 16C64G,从库走只读流量),业务侧反馈:下单接口返回 200 后立刻调「我的订单」列表,每
背景 MySQL 8.0.32,一主一从架构,binlog_format=ROW,从库已开并行复制(slave_parallel_workers=8,slave_parallel_type=LOGICAL_CLOCK)。业务表 t_sett
结论先行 对千万级 InnoDB 表,"LIMIT offset, size" 这种「偏移分页」在 offset 越大越慢,且慢得非线性的——offset 到 200 万时单页查询 P99 能飙到 8 秒以上。换成 keyset(游标)分页
一个 1.2 亿行 UPDATE 让从库复制延迟 31 分钟:大事务的拆解、定位与治理 一、现象与背景 上个月我们的一条离线对账任务,把订单宽表 "t_order_stat"(约 1.2 亿行、InnoDB、MySQL 8.0.32)里 "
一、现象与背景:加了索引,P99 反而涨了 30% 上个月给一套订单系统做慢查询治理。核心表 "t_order" 规模:1200 万行、单表 3.1GB、InnoDB、MySQL 8.0.32。业务方甩来一条高频查询: SELECT id,
discussion
千万级大表到底该不该上分区表?三种路线的取舍
背景:最近带团队做一张 2 亿行的订单流水表治理,业务方一上来就说"先分区吧,分区快"。我犹豫了很久——DBA 圈子里关于"分区表"的立场其实分裂得很厉害,今天想借这个帖把几种常见做法摊开聊聊。 常见分歧: 1) 分区党:RANGE 按 c
背景:MySQL 8.0.36,InnoDB,一张订单表 order 约 1.2 亿行,主键 id,二级索引 idx_status (status)、idx_status_create (status, create_time)。列表页按
现象或背景 上个月给订单主表 "t_order"(2.4 亿行、单表 118GB,InnoDB,MySQL 8.0.32)补一个二级索引 "idx_status_create_time",业务侧只给了一个 20 分钟的变更窗口,且要求全程不
discussion
慢查询到底该加索引、改写 SQL、还是上缓存?聊聊你的取舍顺序
背景 社区里已经有一篇讲「慢查询治理三件套顺序」的文章,把「先定位 → 再判断 → 最后加索引/改写」讲得很清楚,我基本认同。但真正到动手那一刻,我发现团队里吵得最凶的其实不是「顺序」,而是同一类慢查询,到底用哪条路去解:加索引、改写 SQ
背景:MySQL 8.0.36,InnoDB,一张约 5000 万行的日志表 access_log,主键 id,二级索引 idx_path (path),idx_path_status (path, status),idx_time (cr
背景:MySQL 8.0.36,主从架构(单主 + 1 从,半同步),主库一台 16C/64G/ESSD,从库同规格。业务在每天 02:00–03:30 跑一次订单归档批处理:把 orders 表里 create_time 早于 90 天的
question
MySQL 8.0 复合索引第二列是范围条件,第三列还能被用到吗
背景:MySQL 8.0.36,InnoDB,一张约 1200 万行的订单表 orders,现有复合索引 idx_a_b_c (a, b, c),a 是租户 id(bigint,等值),b 是订单时间(datetime,范围),c 是状态(
question
MySQL 8.0 自增主键跳号,如何定位根因
背景:MySQL 8.0.36,InnoDB 单表(约 8000 万行),主键为自增 id。业务方反馈:连续 2 天内 id 出现约 3 万次的跳号,期间没有观察到批量插入,也没有触发器或 AFTER INSERT 钩子。 现象: 1) S