Lec 5数据库专题——索引、OLTP/OLAP、NoSQL 与数据清洗
Lec 5 数据库专题——索引、OLTP/OLAP、NoSQL 与数据清洗(Topics in Databases)
对应 MIT CTL.SC4x · Supply Chain Technology and Systems · 第 5 讲
核心参考:SC4x Key Concept Document (Summer 2019) & MITx MicroMasters SCM 课程大纲
TL;DR
- B 树索引大幅降低数据检索时间复杂度(),但需权衡高频写入下的维护开销。
- OLTP 侧重高并发事务一致性(ACID),OLAP 数据仓库与数据湖面向海量多维聚合分析。
- 非结构化物联网数据依赖 NoSQL 弹性存储,ETL 数据清洗是下游分析质量的生命线。
读写分离与架构隔离原则
在大型电商与制造企业中,严禁允许数据分析师或 BI 报表直接连接承载实时交易的生产 OLTP 数据库执行大范围 GROUP BY 查询。一次未加索引的全表扫描足以锁死核心库存表,导致前端下单接口超时瘫痪。现代架构必须通过基于日志的变更数据捕获(CDC)将数据准实时异步写入 OLAP 列式数据库,实现交易与分析的物理级隔离。
1. 本讲的定位
前面三讲把关系数据库和 SQL 的基本功练完了。这一讲是承上启下的"数据库工程实战补充包":如何让查询更快(索引)、什么时候该用另一类数据库(数据仓库/OLAP)、什么时候关系模型本身就不够用(NoSQL)、数据和算力放在哪(云计算)、以及数据进库之前必须做的脏活——数据清洗。这些内容是供应链从业者把数据库真正用在实际工作中的必修课。
2. 索引与性能(Indexes and Performance)
提升 SELECT 操作性能最好的办法,是对查询中用到的一个或多个列创建索引。索引条目就像"指针",能让数据库快速定位哪些行满足 WHERE 条件,并取出这些行的其他列值。MySQL 中所有数据类型都可以被索引,而主键和外键会被自动索引,以便更快检索。
索引不是越多越好:
- 为查询中可能用到的每一列都建索引很诱人,但多余的索引会浪费存储空间,也会拖慢 MySQL 判断该用哪个索引的过程;
- 索引还会增加
INSERT、UPDATE、DELETE的成本,因为每次写操作都必须同步更新索引; - 因此需要在"查询速度"与"写入/维护成本"之间找到合适的平衡点。
示例:一张 Customer 表包含 Customer_ID(主键)、Customer name、City、State、Postal code、Address。若想快速按州+城市筛选客户,可以:
CREATE INDEX IX_City_State
ON Customer (State, City);
3. 数据库与数据仓库:OLTP vs OLAP
到目前为止接触的都是**联机事务处理(OLTP,Online Transaction Processing)**数据库。还有另一类必须了解的数据库——联机分析处理(OLAP,Online Analytical Processing)。二者用途完全不同:
用例对比
| OLTP | OLAP |
|---|---|
| 支撑实时业务运营 | 执行分析与报表 |
| 支持业务任务的落地执行 | 支持数据驱动的决策 |
| 例:在线商店的交易 | 例:数据挖掘、机器学习 |
| 例:展示过去几小时/几天业务健康度的仪表盘 | 例:基于历史数据的预测 |
| 并发性至关重要 | 并发性可能不那么重要 |
关键差异对比
| OLTP | OLAP |
|---|---|
| 为写(更新、插入)优化 | 为读优化 |
| 遵循范式(normal form),冗余少 | 反规范化(denormalized),冗余多 |
| 索引少、表多 | 索引多、表少 |
| 为简单查询优化 | 用于复杂查询 |
| 极少存储可由已有数据推算出的指标 | 常常存储各类衍生指标 |
| 整体性能:为小规模写入和简单读取而快速设计 | 整体性能:为读取和大规模写入而设计,但因数据体量大,相对较慢 |
一句话总结:OLTP 是"跑业务"的数据库,OLAP 是"做分析"的数据库——供应链里,ERP 后台大多是 OLTP,而数据仓库/BI 报表系统大多是 OLAP。
4. NoSQL 数据库
NoSQL 数据库提供了一种不同于关系表的数据存储与检索机制。与 SQL 不同,NoSQL 中的数据是非结构化的,不以表的形式存储,而是采用其他机制。
相对 SQL 数据库的优势:
- 某些使用场景下更快——简单的读写操作用 NoSQL 方案速度很快;
- 更灵活——当很多实体之间的关系尚不明确时,也能存储数据;
- 更容易横向扩展(scale),因为其结构更简化。
注意:涉及一致性要求高的事务型业务数据,通常仍然存储在关系数据库中,因为关系数据库对读写一致性的处理更成熟。
4.1 NoSQL 的四种类型
| 类型 | 特点 |
|---|---|
| 键值数据库(Key-Value) | 最简单的 NoSQL 选项,以"无模式(schema-less)"方式存储索引键与值;每条记录可以有不同的字段/属性,与唯一键一起存储;数据模型不预先定义,空字段不会被存储 |
| 文档型数据库(Document-Oriented) | 概念类似键值型但更复杂;每个"文档"(键值对的集合,也叫 collection)拥有自己的数据和唯一的键,用该键检索 |
| 列式数据库(Column-Oriented) | 把数据表按列而非按行存储,每行有索引("RowID");"RowID" 相当于键,属性相当于值;某些查询下能更高效地存储列信息,具备优秀的可扩展性和高性能 |
| 图数据库(Graph) | 存储互相关联、最适合用图结构表达的数据;对处理高度互联、复杂关系的系统非常高效 |
5. 云计算(Cloud Computing)
云计算让用户和企业能够通过互联网访问共享资源池(计算网络、服务器、存储、应用与服务)。
相对传统系统的优势:启动成本低、开发测试风险低、硬件(软件)由第三方托管、全球触达能力、高可用高持久、按需扩展/按用量付费,某些情况下还可以与本地基础设施结合使用。
三种云计算服务类型
| 类型 | 特点 | 例子 |
|---|---|---|
| IaaS(基础设施即服务) | 外包硬件;用户自行提供操作系统、数据库、应用等;最灵活,前期总 IT 成本较高 | Rackspace |
| PaaS(平台即服务) | 外包运行环境;云平台提供操作系统、数据库等 | Amazon、Microsoft、Google |
| SaaS(软件即服务) | 外包整套软件;用户只需配置第三方应用;最不灵活,但前期总 IT 成本最低 | Salesforce、HubSpot |
从 IaaS → PaaS → SaaS,第三方接管的层级越来越多,企业自身需要维护的东西越来越少,但可定制的灵活度也随之下降。(本讲先给出这张速查表,第10讲"软件选型与实施"还会从架构和实施决策角度再次深入。)
6. 数据清洗(Data Cleaning)
数据在被写入数据库之前必须先清洗/预处理——这是一项耗时但必不可少的工作,因为数据库的质量最终取决于数据本身的完整性。
三类数据清洗解决方案
| 方案 | 特点 |
|---|---|
| 现成商业软件(Off-the-shelf) | 图形界面,无需编程,便于与非程序员协作;支持大数据集处理、可复现工作流、版本控制等高级功能;软件收费(例:Trifacta、Paxata、Alteryx、SAS) |
| 开源编程语言(Open-source) | 基于数据框(data frame)和数据字典工作,需要一定编程能力,但语言普遍对搜索引擎友好(易查资料);优点与商业软件类似,但需要编程经验、有时更耗时;软件免费 |
| Unix 命令行工具 | 不如前两者对用户友好,但速度快、用途广;非常擅长把会让其他软件崩溃的大数据集拆分处理;软件免费,且常常内置在操作系统中 |
7. 本讲小结与学习目标回顾
- 理解索引及其对性能的影响;
- 认识联机事务处理(OLTP)与联机分析处理(OLAP);
- 复习 OLTP 与 OLAP 的用例与关键差异;
- 认识 NoSQL 数据库;
- 复习各类 NoSQL 数据库;
- 认识云计算,复习云计算提供的服务类型;
- 熟悉云计算的优势;
- 认识数据清洗的重要性。
下一讲(Lec 6):数据库准备好了,接下来要从数据里"挖"出规律——进入机器学习导论:算法分类、监督/无监督学习,以及模型质量(偏差-方差权衡)。