# Summary
为什么做预训练数据 **不** 用 MySQL
1. **吞吐瓶颈**
- 训练时 GPU 期待 _GB/s_ 顺序读;MySQL 点查 + 网络交互会拖慢流水线。
2. **无索引需求**
- 预训练只按**顺序**遍历文本,不需要按主键 / 二级索引检索。
3. **压缩与成本**
- 文件 + zstd 压缩可轻松做到 2‑3× 体积缩减;MySQL 行格式无法针对长文本高效压缩。
4. **易部署 & 可移植**
- 分 shard 的 JSONL/Parquet 放任何对象存储即可;拷贝目录就能训练,省去 DB 迁移。
# Cues
# Notes
## 两种做法的核心定位
|维度|DataTrove / NeMo Curator(分片 JSONL/Parquet)|传统 MySQL 存储|
|---|---|---|
|**目标场景**|**离线批量训练**:一次写入、顺序流式读取,追求 _高吞吐 + 压缩比_|**在线事务/查询**:高并发随机读写、ACID|
|**数据类型**|巨量**半结构化长文本**(网页段落、元数据)|典型**结构化行数据**(行/列固定、短字段)|
|**IO 模式**|训练时 _sequential scan → batch loader_;写时追加|点查 / 索引查询;频繁 INSERT/UPDATE|
|**可扩展性**|直接把 shard 放对象存储;节点越多吞吐越高|水平分库分表成本高;索引维护贵|
|**压缩/成本**|zstd /gzip 按文件压缩,冷数据=冷存储|存储行格式 + 索引,压缩有限,空间贵|
|**依赖/复杂度**|依赖少,不必部署数据库;本地或 S3 均可|需运维 MySQL 集群、备份、主从同步|
|**与 PyTorch/Megatron 对接**|DataLoader 直接 mmap / fsspec 逐 shard 读|需自写 connector 拉行数据、性能瓶颈|
---
## 为什么做预训练数据 **不** 用 MySQL
1. **吞吐瓶颈**
- 训练时 GPU 期待 _GB/s_ 顺序读;MySQL 点查 + 网络交互会拖慢流水线。
2. **无索引需求**
- 预训练只按**顺序**遍历文本,不需要按主键 / 二级索引检索。
3. **压缩与成本**
- 文件 + zstd 压缩可轻松做到 2‑3× 体积缩减;MySQL 行格式无法针对长文本高效压缩。
4. **易部署 & 可移植**
- 分 shard 的 JSONL/Parquet 放任何对象存储即可;拷贝目录就能训练,省去 DB 迁移。
---
## 什么时候 **会** 把文本放 MySQL?
- **在线检索 / 辅助特征**:需要按 user_id、time_range 实时查询日志、评论等。
- **数据标注平台**:UI 连 MySQL 做增删改查、状态追踪。
- **小规模实验**:几十万条文本,团队已有 MySQL,临时可用。
---
### 📌 一句话总结
> **预训练语料 = 大型离线顺序读** → 用分片文件 + 轻量 Writer;
> **业务数据 = OLTP 随机读写** → 用 MySQL / ClickHouse 等数据库。