标签频道
MySQL
该标签下的文章、提问与讨论帖。
【背景】MySQL 8.0.32 / InnoDB,单库 32C/128G,innodb_buffer_pool_size=64G。日志明细表 log_event 约 3 亿行,PK=id(自增),索引 idx_ct (create_tim
discussion
大表 DDL 在线变更:双写对账 vs 锁表停机,你们团队到底怎么选?
【背景】 社区里连接池、超时重试、异步化都聊得挺透了,但有一个更「硬」的问题我很少看到被正面讨论:一张千万级甚至亿级行的大表,要加列、改索引、改类型,你的团队到底怎么落地? 我自己踩过的场景:一张 8000 万行的订单流水表,业务要求「加一
一、现象:一条"看起来很简单"的查询,P99 卡在 1.8s 去年我们迁移订单中心到 MySQL 8.0.32,主表 "orders" 约 2.1 亿行,单表 190GB。客服后台有一个高频接口:查某用户最近的 20 条订单: SELECT
背景:MySQL 8.0.32 / InnoDB,单主单从,主库承载支付清结算,核心表 t_settle_record 约 2.8 亿行,innodb_purge_threads=4,隔离级别 REPEATABLE READ。业务方有一个凌
«结论先行:"INSERT ... ON DUPLICATE KEY UPDATE"(下称 ODKU)是"写法上最方便"的幂等手段,但它把"唯一索引冲突检查"和"UPDATE"塞进同一个事务、同一把行锁里完成,在高 QPS + 高重复率场景
背景: 我负责一套订单系统,核心表 t_order 约 4200 万行、单表含所有二级索引约 18GB,InnoDB,MySQL 8.0.32,单主单从。业务写入 QPS 日常 800~1200(以 INSERT 为主,少量 UPDATE
一、现象:主从延迟 47 秒,从库告警炸了 上个月给一套库存系统做巡检。核心表 "t_inventory_log"(42 亿行、单表 1.8TB、InnoDB、MySQL 8.0.32、binlog=row)。业务方一条批量回刷脚本: UP
«结论先行:InnoDB 的主键是聚簇索引的物理顺序,主键的随机性直接决定写入是顺序 IO 还是随机 IO。把 UUID v4 换成雪花 ID,同样的批量写入 P99 从 1.8s 降到 52ms,收益 35 倍——这不是"ID 格式"问题
背景:MySQL 8.0.36 / InnoDB,隔离级别 REPEATABLE READ。用户地址表 user_address,PK=id (bigint auto),二级索引 idx_user (user_id bigint, addr
«结论先行:软删除("deleted_at" 列 + "WHERE deleted_at IS NULL")用得越久,二级索引里「同一个 customer_id 下挂着一串已删除行」的簇就越大,优化器从「覆盖索引直接出结果」退化成「索引扫描
一、现象:一条"写入"接口,把磁盘 IO 打到 92% 先说结论:这次写入慢,不是慢 SQL、不是连接池、也不是网络,而是"主键用 UUID 导致 InnoDB 随机写 + 页分裂"。把主键换回自增后,同一台机器、同一份流量,写入 P99
【背景】 MySQL 8.0.32 / InnoDB,单库承载订单查询与归档。核心表 t_order 约 8000 万行、数据文件 15.2GB(含二级索引约 22GB),innodb_buffer_pool_size=16GB(机器 64
结论先行 批量插入慢,十有八九不是 SQL 写得差,而是「一次只提交一条」+「驱动没把 batch 拼成 multi-row INSERT」+「每条都强制刷盘」三件事叠在一起。我们一个埋点落库服务,单机写入吞吐从 1200 行/s 提到 9
«结论先行:buffer pool 命中率不是越高越好,buffer pool 也不是越大越好。命中率 99.7% 时 P99 依然可以打到 800ms,因为「命中」不等于「无代价」——一次冷读抖动可以把 LRU young list 冲刷
背景 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、