很多开发人员第一次接触Google Cloud BigQuery时,很容易把它理解成“云端的大型MySQL”。两者都可以使用SQL查询数据,但如果真的按照MySQL的思路设计BigQuery,往往很快就会遇到性能、成本甚至架构上的问题。BigQuery与MySQL最大的区别,并不是一个放在云端、一个可以部署在自己的服务器上,而是它们从底层开始就是为两种完全不同的工作负载设计的。
MySQL首先是一套关系型数据库系统,最典型的使用场景是OLTP,也就是在线事务处理。用户注册、订单创建、库存修改、支付状态更新、网站后台写入新闻、用户修改个人资料,这些操作通常都要求单次读写快速完成,并且需要事务、锁、约束以及明确的一致性语义。一个典型MySQL表通常按照行组织数据,查询一条用户记录时,数据库可以通过B-tree索引迅速定位对应的数据页,然后完成读取或者更新。
BigQuery则主要解决另外一个问题:如果企业已经积累了几亿、几十亿甚至更大规模的数据,现在希望回答“过去三年的销售趋势是什么”“不同地区客户的购买行为有什么变化”“每天产生多少日志”“某类用户在不同时间段的转化率是多少”,应该怎样高速扫描和分析这些数据。BigQuery因此属于云数据仓库和分析平台,而不是用来替代网站后台MySQL的通用事务数据库。
BigQuery的一个核心特点是列式存储。分析一张包含用户ID、时间、地区、产品、价格、设备等几十甚至上百个字段的大表时,很多查询实际上只需要其中几个字段。列式存储可以减少无关数据读取,并结合压缩、分布式执行和并行计算,在大规模扫描场景下获得非常高的吞吐量。MySQL的行式存储则更加适合频繁读取和修改完整记录或者少量记录的事务型操作。
BigQuery的另一个关键概念是Serverless。使用者通常不需要自己购买一台“BigQuery服务器”,也不用像传统数据库那样直接管理底层磁盘、数据库实例和操作系统。用户提交SQL后,BigQuery负责调度底层计算资源,并将查询任务拆分成大量并行工作。对于大型数据分析来说,这种架构的价值并不是简单的“机器更快”,而是可以让大量计算资源同时处理数据。
例如,一条SQL需要扫描数TB数据并按照日期、地区和产品进行聚合。传统MySQL当然也可以处理大量数据,但如果数据规模和并发不断增长,就需要考虑索引、分区、读写分离、分库分表、复制、缓存以及硬件扩容等问题。BigQuery则从设计之初就把这种大规模分析作为主要工作负载,通过分布式执行引擎完成扫描、过滤、Join、聚合和排序。
这并不意味着BigQuery查询永远比MySQL快。恰恰相反,如果只是根据主键查询一条用户记录,MySQL可能在毫秒级完成,而BigQuery为一次分析查询启动和调度计算资源所付出的成本和延迟完全没有必要。拿一把大型工业切割机去切一根火柴,不能因为机器更大就说它更适合这个工作。
索引也是两者思维差异非常明显的地方。MySQL高度依赖索引设计。主键、联合索引、覆盖索引、索引选择性以及查询执行计划,都可能直接决定一个业务接口是几毫秒还是几秒。BigQuery则不是按照传统MySQL的“给每个查询建立一个合适索引”的思路运行。BigQuery更强调减少扫描数据量、合理使用分区和聚类、优化SQL执行方式以及控制Join和中间结果规模。
因此,在BigQuery中,表分区尤其重要。例如按照日期进行分区后,如果查询明确限制时间范围,系统就可以避免扫描完全无关的历史数据。聚类则可以进一步改善特定字段上的数据组织。对于大型数据仓库,“扫描了多少数据”往往比“SQL写了多少字符”更加值得关注。
这也直接关系到成本。BigQuery并不是简单地“用多少算力就付多少钱”这么单一。不同BigQuery计算模式具有不同的计费方式,包括按需计算以及容量型计算等模式;存储也有相应的费用。因此设计BigQuery数据仓库时,不能只盯着服务器价格,而应该观察查询扫描量、查询频率、并发量、存储规模以及工作负载是否稳定。
一个写得不好的SQL,即使结果只有几MB,也可能为了得到这个结果扫描大量数据。如果每天运行数百次甚至数千次,这种浪费会迅速变成真实的云账单。因此BigQuery工程师通常会非常重视分区裁剪、避免不必要的SELECT *、控制Join规模、减少重复扫描以及合理安排ETL和分析任务。
MySQL的成本结构则不同。自己运行MySQL时,需要考虑服务器、磁盘、内存、网络、备份、监控、复制、灾备、安全更新和数据库管理员等成本。如果使用Cloud SQL for MySQL等托管服务,则底层基础设施维护负担会明显降低。因此不能简单说“MySQL成本高、BigQuery成本低”。真正的区别是两种系统的成本结构和扩展方式不同。
BigQuery特别适合日志分析、数据仓库、商业智能、历史数据分析、数据科学、机器学习特征分析以及大规模报表。例如一家电商企业可以让MySQL负责保存订单、客户和库存等在线业务数据,然后把业务数据持续导入BigQuery。分析人员再在BigQuery中计算销售趋势、客户分群、商品表现和地区统计,而不是直接让分析人员不停地扫描生产MySQL数据库。
这种架构中,MySQL和BigQuery甚至不是竞争关系,而是上下游关系。MySQL负责“业务正在发生什么”,BigQuery负责“把已经发生的大量业务数据放在一起分析”。两者之间可以通过数据同步、批量ETL、流式数据管道等方式连接起来。
实时性也需要准确理解。BigQuery并非只能处理每天一次的离线数据,它已经支持流式数据摄取和近实时分析场景。但“可以实时分析”并不等于“可以替代MySQL完成实时事务”。分析系统和事务系统面对的目标不同。BigQuery可以快速告诉你过去一小时某类商品销售了多少,而用户点击“购买”按钮后,订单库存扣减、支付状态修改以及事务回滚仍然需要适合事务处理的数据库系统。
同样需要避免把BigQuery描述成传统意义上的“数据湖”。Google Cloud的数据平台通常可以把对象存储、数据湖、数据仓库、流处理和治理工具组合起来使用。BigQuery是其中非常重要的数据分析和数据仓库平台,而不是把整个Google Cloud数据湖概念都压缩成一个产品。
如果业务需要真正的HTAP,也就是同一个系统同时承担大量事务和分析工作,就更需要根据具体需求选择架构。Cloud Spanner、MySQL、BigQuery以及其他Google Cloud数据服务解决的问题并不完全相同。不能因为BigQuery具有强大的分析能力,就把它直接塞进一个高并发交易系统。
对于网站和普通应用开发者来说,可以把两者理解成两种完全不同的工具。一个在线商店的订单系统,如果每次用户下单都需要通过BigQuery完成库存更新,这个架构通常就很不自然;但如果每天有几十亿条订单、点击和日志数据,需要计算用户行为、销售趋势和广告转化,那么让MySQL承担全部分析任务同样是一种架构浪费。
真正成熟的云架构往往不是“BigQuery还是MySQL二选一”,而是让每一种数据库负责自己最擅长的工作。MySQL处理高频、小事务、强约束的在线业务;BigQuery处理大规模扫描、聚合和分析;对象存储可以承担原始数据和数据湖层;数据管道负责把不同来源的数据可靠地送入分析体系。
所以,BigQuery与MySQL的根本区别可以浓缩成一句工程判断:MySQL首先关心的是“怎样快速、可靠地处理一笔业务”,BigQuery首先关心的是“怎样高效地从海量数据中计算出一个答案”。前者围绕事务和单条记录展开,后者围绕大规模数据扫描和并行分析展开。理解这一点以后,很多数据库选型问题其实都会变得清楚:不是哪一个数据库更强,而是你的系统到底是在处理一笔正在发生的交易,还是在从过去积累的数据中寻找规律。
Google Cloud BigQuery 是什么,它和传统 MySQL 数据库有什么区别
图片说明:示意图 图片来源:Public Domain(公有领域)
喜欢这篇报道?
使用下面的功能,方便以后继续阅读和分享 MNewsTV
关于文章收藏
收藏不需要注册帐号,收藏信息仅保存在当前浏览器中。
删除收藏请进入「我的收藏」进行管理。
捐助(Paypal): https://www.paypal.me/observeccp 订阅中国观察电报 Telegram : https://t.me/s/ObserveCCP