分类频道
数据库
该分类下的文章、提问与讨论帖。
结论先行 批量插入慢,十有八九不是 SQL 写得差,而是「一次只提交一条」+「驱动没把 batch 拼成 multi-row INSERT」+「每条都强制刷盘」三件事叠在一起。我们一个埋点落库服务,单机写入吞吐从 1200 行/s 提到 9
«结论先行:buffer pool 命中率不是越高越好,buffer pool 也不是越大越好。命中率 99.7% 时 P99 依然可以打到 800ms,因为「命中」不等于「无代价」——一次冷读抖动可以把 LRU young list 冲刷
discussion
分库分表之后,跨片 JOIN 和聚合查询到底该谁来扛?
背景 做了 10 年大数据平台,最近半年在两个团队里反复撞到一个"分完之后才暴露"的坑:分库分表把单表 80GB 拆到了 16 个分片,单片查询 P99 从 120ms 降到 8ms,看起来很完美;结果第二天报表团队来找——"用户维度的 G
【背景】 我负责一个多租户 SaaS 的数据分析查询服务:JDK 17 + Spring Boot 3 + PostgreSQL 15(单主库,16C64G)+ PgBouncer(transaction 模式,pool_size=20/租
背景 MySQL 8.0.30,InnoDB,一台 64C / 256G 裸金属,承载 3 个业务库。核心库有一张 1.2 亿行的支付流水表 "t_pay_flow"(PK=id,二级索引 "idx_merchant_status"、"id
一、现象:写入 QPS 没变,P99 却从 6ms 飙到 11ms 去年 Q3 给一套支付清结算系统做性能治理。核心表 "t_settle_record": - 规模:单表 2.8 亿行、InnoDB 16KB 页、MySQL 8.0.32
discussion
MySQL 事务隔离级别:RC 还是 RR?8 年 DBA 视角下我最纠结的一个默认值
背景: 做 DBA 这 8 年,我接手过的 MySQL 实例里,大约 60% 跑在默认的 REPEATABLE READ(RR),40% 被业务方或前任 DBA 调成了 READ COMMITTED(RC)。每次新团队来问我"隔离级别该用哪
一、现象与背景 先给结论:这次毛刺的根因既不是 InnoDB、不是 binlog、不是网络,而是 Linux 内核的 page cache 回写策略——"vm.dirty_ratio" 默认 20% 在 32GB 内存的机器上等于允许 6.
背景:MySQL 8.0.36,InnoDB,订单流水表 t_settlement 约 1.2 亿行,PK=id,现有 3 个二级索引(idx_merchant_time、idx_status、idx_batch_no)。业务要求新增复合索
一、现象:没人报警,但 INSERT 吞吐悄悄掉了 40% 背景:一套 MySQL 8.0.32 / InnoDB 的物流履约系统,核心表 "t_fulfillment_item"(履约明细),规模 4500 万行、单表数据 28.6GB、
article
写主库读从库却读到旧数据:主从延迟的量化、半同步与三种兜底
结论先行:读写分离里「我刚写完,读从库却是旧值」,根因不是代码 bug,而是主从复制是异步的——主库把 binlog 落盘就返回成功,从库要等 relay log 拉取 + 重放,中间这段窗口(毫秒到秒级)读从库必然读到旧数据。解法分两层:
背景:MySQL 8.0.36,InnoDB,REPEATABLE READ。一张 3200 万行的工单表 tickets,主键 id(自增),二级索引 idx_tenant_status (tenant_id, status, creat
一、现象:监控里那条「不致命」的曲线 先给背景。一套 MySQL 8.0.32 / InnoDB 的订单+账务系统,主库 "innodb_buffer_pool_size=32GB"、"innodb_purge_threads=4"、"in
discussion
数据从千万涨到亿级,历史数据到底该归档、分区、还是冷热分离?
背景 做大数据平台这几年,我遇到的最频繁的架构讨论不是「怎么加索引」,而是「表越来越大,历史数据怎么办」。 一个很典型的场景:订单流水表从 2000 万涨到 1.2 亿行,单表 80GB+,80% 的数据是 3 个月以前的。日常业务查询 9
背景:MySQL 8.0.36,单主 + 2 从(半同步 rpl_semi_sync_master_wait_for_slave=ON),主库 32C/128G/ESSD PL2,从库同规格但磁盘是 SSD。binlog 日均增长约 200
背景:MySQL 8.0.34,InnoDB,业务库有一张订单流水表 t_order_flow(约 1.2 亿行,PK=id,二级索引 idx_merchant_time (merchant_id, created_at)、idx_stat
«结论先行:索引没变、SQL 没变、buffer pool 命中率也没掉,但 P99 还是从 15ms 飙到了 3.4s——根因是 InnoDB 的统计信息(cardinality)在数据批量写入后严重失真,优化器据此选错了索引/访问路径。
MySQL 连接池打满不是 max_connections 的锅:一次 P99 从 80ms 飙到 12s 的复盘 一、现象与背景 2024 年 3 月,某中型电商订单服务在内部压测中出现了严重的性能退化: - 数据库:MySQL 8.0.
discussion
单表从 1 亿行到 10 亿行:升配、读写分离、分区、分库分表,你的优先级到底怎么排
背景 做了 10 年 DBA,被业务方问得最多的一个问题就是:"我们的表要爆了,下一步该怎么办?" 每次问这话的时候,团队里通常已经开始在四条路线之间摇摆: 1. 垂直扩容:升配,更大规格的实例(vCPU / 内存 / SSD 升级一档),
一、现象与背景:连接数翻倍,接口反而更慢 先给结论:当瓶颈在 InnoDB 行锁排队时,把连接数加上去,QPS 会微涨、P99 会暴涨,因为新连接只是多排队的人,不是多干活的人。 具体场景:一个库存扣减服务,MySQL 8.0.32(16C