构建实时搜索的选型与思考
前言
本文具体探讨 MySQL 数据实时同步到 Elasticsearch (以下简称 ES ) 技术方案和思考,同时使用一定篇幅介绍一些前置知识,从理论到实践,让读者更好的理解这块内容和相关问题。包括:
- 为什么我们要将数据从 MySQL 实时同步到 ES ,本质是什么?
- 为什么是 ES,而不是其他 OLAP 引擎?
- MySQL 到 ES 数据实时同步方案中有哪些细节需要注意?
- MySQL 到 ES 数据实时同步方案可以有哪些选择,优缺点是什么?
相信看完本文,你会对 MySQL 数据实时同步到 ES 有更多的了解。
数据库去规范化
Database normalization is the process of structuring a database, usually a relational database, in accordance with a series of so-called normal forms in order to reduce data redundancy and improve data integrity. It was first proposed by Edgar F. Codd as part of his relational model.
数据库规范化是指关系型数据库中通过一系列数据库范式来减少数据冗余、增强数据一致性的策略。例如我们平时使用的关系型数据库的关系模型可以认为是 Database Normalization 的一种实现方式,这些关系型数据库基本都至少遵循了数据库第三范式,可以称之为 Normalized Database。关于数据库范式的内容,本文不再展开。
Denormalization is a strategy used on a previously-normalized database to increase performance. In computing, denormalization is the process of trying to improve the read performance of a database, at the expense of losing some write performance, by adding redundant copies of data or by grouping data.[1][2] It is often motivated by performance or scalability in relational database software needing to carry out very large numbers of read operations. Denormalization differs from the unnormalized form in that denormalization benefits can only be fully realized on a data model that is otherwise normalized.
Database Normalization 在带来我们看得见的好处同时(利于事务操作性能、存储成本降低),伴随数据规模扩大、并发度提高、复杂度上升,弊端也慢慢展现,这时候 Database Denormalization 能够一定程度满足这些挑战,总体思路是通过一系列降低写入性能的操作例如更多的数据冗余、数据分组等来提升数据库读取的性能。
去规范化的时机
数据去规范化动机多样,当出现因数据复杂操作影响系统稳定性、业务响应/并发要求不满足等都是触发因素。
业务稳定性 问题:面向 C 端的互联网应用特征是并发量较高,SQL 偏向点查点写,相对简单,但是沉淀下来的数据(比如订单、支付等) 需要做运营往往涉及传统企业级应用对于数据库的操作特征,大范围数据栅查、表关联、排序等实时操作,以及满足报表/BI等更加复杂的数据库需求。通过去规范化和负载分离是较合理的选择。
复杂查询性能问题:企业级应用例如ERP、CRM、BOSS或者其他一些企业运营系统,经常涉及表关联、聚合、多维删选、排序等操作,并常常带来性能问题。通过去规范化的一些方式,如下文提到的数据冗余和预计算方式,显著改善性能。
去规范化的几种实现方式
假设有如下三张表,学生、班级和教师。需求是:已知学生的学号,需要查询当前学生的班主任是名字。

使用规范化数据查询,是一个 3 表联查操作,而在数据库中,大体分三步:
- 通过学生学号获取学生信息,得到班级编号
- 通过班级编号获取班级信息,得到班主任工号
- 通过班主任工号得到教师信息,得到班主任的名字
如果在数据量较大,有一定并发要求,并且涉及更多表关联时候,这种计算就不能满足需求,这个时候去规范化的优化方式就登场了。
