b. 查询优化器
要提高数据查询的效率,数据库必须找到一条最优化的执行路径,比如,查询时是否需要使用索引,如果有多个索引,应该选择哪一个,如果数据分布在不同的存储单元(表、集合等)里,应该按照什么顺序来访问效率最高等等。优化器面对的问题可能是一个极其复杂的路径规划问题,它需要在很短的时间里计算出最优路径,需要大量核心优化算法,属于数据库中复杂程度最高的部分。
举个例子,你要带着全家人,包括老人、小孩一起从上海去海南旅行,要制作一个性价比最好、家人满意度最高的计划,那么在计划时需要考虑哪些因素呢?首先,怎么去,是开车去,还是火车去,还是飞机去。开车,路上要花多久,中间需要休息几次,你和太太有没有时间,老人孩子是不是受得了,汽油费用,过路费用;飞机,怎么去机场,行李有多少,带不带得下,机票有没有打折,下了飞机怎么办等等。住什么酒店,去什么景点,老人喜欢去人多的人文景观,太太喜欢安静的地方和方便购物的地方,小孩喜欢有游乐场的地方,要不要酒店 + 景点一起订,会不会有优惠,要不要租车,租什么车......说到这里,是不是可以体会一个查询优化器需要考虑的问题有多少?
当然,这部分工作可以有相对简单的实现(基于规则),比如太太说了,时间确定、飞机来回、五星酒店、带私人沙滩,这样计划就会简单很多。然而,这份工作也可能复杂到难以想象(基于机器学习、基于实际开销等等),比如太太说你全权负责,具体时间不确定,大概在 8月 - 9月,要少花钱多办事,多做调研,找一个最优方案。那么做这个计划就会非常复杂,需要的支持决策信息就会非常多。这样做出来的决策大概率相对会优化,比基于规则实现的计划能适应更多场景。 c. 执行模块
优化器做好了执行计划后,接下来就会有执行的模块按照执行计划对数据进行相关的计算,包括数据的存取、常规的加减乘除、排序、平均值、哈希,也会包括一些机器学习的算法,数据的压缩/解压缩,最后将计算完成的结果返回给客户端。
d. 内部管理和调度
数据库要正常地工作,还会需要一些内部协调管理的模块,比如内存和存储同步,存储空间整理,元数据管理,集群状态检测,容错和故障恢复等。 e. 管理工具和接口
为了提高易用性,数据库都需要提供一套管理工具,比如备份/恢复、状态检测、运行时监控、资源隔离、权限管理、安全审计、自定义接口、各种数据访问接口等。 数据库的发展和展望
数据库的发展是伴随着计算机体系架构的发展而不断演进的,从主机,到个人电脑 + 网络(x86),到现在的云服务,数据库也经历了一系列的演化历程。
a. 主机时代
最初的计算机和数据库只是在航空航天、军事领域使用,只需要支持专业的数据分析人员进行数据分析。到了上世纪 70 年代末,伴随着计算机进入更多商业场景,大量数据分析的需求产生了,数据库则需要面对更为普遍的用户需求。在 IBM 最早发布的关系型数据库的论文中,最强调的一点就是希望能够让数据库的用户不用再去操心数据应该如何存储和组织,而能够高效率使用这些数据进行分析。
为了方便用户的使用,SQL(结构化查询语言)被定义了出来,按照这样的语法,数据库用户只需要关注数据该如何分析,不需要关注底层的数据分布和存储等。
为了要支持大量用户的并发数据操作,数据库事务特性被定义了出来,保证在并发的数据操作下,用户能够看到符合业务逻辑的数据内容。
为了保证数据库的高效率和安全性,数据库重做日志(事务日志)被设计出来,包括当前数据库中经常出现的一系列概念,比如回滚日志(undo log)、提交日志(commit log)、检查点(checkpoint)等等。
主机时代的硬件成本极其昂贵,不论是存储、内存还是CPU资源,相对来说都很稀缺。那么,数据库在设计和使用上就会采用各种算法和架构来降低对内存的使用,减少数据的冗余,提高数据的检索效率。因此,各种数据索引类型,功能强大的查询优化器,数据缓存算法等在数据库中得到了极大的发展。同时在使用数据库时,也要对数据进行各种复杂的模型设计(三范式模型、星型模型、雪花型模型等等)以降低数据的冗余程度,当然,这样也会增加数据库应用的开发难度。 b. x86 时代
伴随着 x86 服务器的广泛使用和网络技术的发展,把 N 台 x86 服务器通过网络组建成一个集群,利用这个集群的计算、存储能力来取代昂贵的主机也就更加具有性价比。在这种趋势下,也就设计出了各种能够使用集群能力的分布式数据库系统,这些系统的核心思想就是把数据分散在不同的节点上,利用多个节点的计算和存储资源提高对数据的存储和分析能力。在分布式的处理架构下,数据一致性协议、多副本机制、高可用机制、数据分片机制、扩容/缩容机制等等也都成为了分布式数据库必须要设计和解决的问题。
在 x86 时代,由于硬件成本的大幅下降,用户更多关注数据分析的灵活性和交付的效率。因此,使用数据库时更多会关注如何加快数据分析的过程、如何让数据更易于人类理解,而不需要为了降低数据的冗余而进行复杂的模型构建。 c. 云时代
随着技术的进一步发展,通过把传统硬件虚拟化/容器化等技术,提高硬件资源的使用效率,降低生产运维成本的云服务被越来越多企业采用。为了更好地适应云服务的技术体系,数据库也设计出了相关的云特性,比如存储计算分离、弹性伸缩、微服务化、跨域数据同步等等。
云时代,用户更加关注数据分析的效率和投入产出比,更加关注产品是否能够提供便利的一体化数据处理服务,让业务开发者能够更加专注于业务本身,而数据库服务也在朝着标准化云服务的方向不断演进。 d. 展望
不同的数据库架构和部署方式不是一个简单的迭代和取代的关系,而是在很长一段时间里会同时存在并且逐步迭代的过程。时至今日,依然有不少金融机构会选择使用在主机上的数据库产品,只是新的业务和场景非常有限。而基于 x86 服务器的数据处理产品,还是当前企业数据库的主流选择。与此同时,云数据库的市场份额也在逐步增长和扩大。采用何种数据库产品要根据自身的业务需求来决定,合适的就是最好的。当然从技术演进的方向上看,云技术(包括公有云和私有云)会是大势所趋,因为云能够提供更高的效率。
数据库作为信息产业的三大基础技术(还有芯片和操作系统)之一,在相当长的时间里,不论从资本还是技术方面都非常火热,国内近几年来也出现了相当多优秀的数据库产品和企业。在人类迈向数字化文明的进程中,必定会产生越来越多的数据,也需要从数据中挖掘出更多的价值,而数据库作为承载数据的核心,也必将持续发挥重要作用。有幸一直在从事这个领域的工作,期待与广大同仁一道为人类数字化技术的进步贡献力量。
Zilliz 以重新定义数据科学为愿景,致力于打造一家全球领先的开源技术创新公司,并通过开源和云原生解决方案为企业解锁非结构化数据的隐藏价值。 Zilliz 构建了 Milvus 向量数据库,以加快下一代数据平台的发展。 Milvus 数据库是 LF AI & Data 基金会的毕业项目,能够管理大量非结构化数据集,在新药发现、推荐系统、聊天机器人等方面具有广泛的应用。