数据库基础、使⽤C语⾔构建⼀个数据库、SQL语⾔、MySQL
⽂章⽬录
⼀、数据库
1.什么是数据库
数据库就是英⽂的“database”翻译来的,data + base,故名思义就是数据的根源,数据的基础。那么为什么要有数据库呢,数据库⾸先是个计算机软件,在所谓数据库诞⽣之前,常⽤⽅法可能是程序员⾃⼰写⼀个⼩程序来完成数据处理分析这样的⼯作。
伴随着计算机的普及,越来越多的场景开始使⽤计算机,产⽣了越来越多的数据,也催⽣了越来越多的数据分析需求。为了降低数据分析的门槛,让更多⼈能够更⽅便⾼效地管理分析数据,⼯程师们就打造了⼀种专门的软件来帮助⼈们对数据进⾏合理的存储以提⾼存取效率,提供易⽤的接⼝和丰富的分析算法以⽅便使⽤,集成有效的管理⼯具以提⾼数据安全性等等,这就是数据库,也被称为数据库管理系统(DBMS,Database management system)。
数据库是⼀整套数据管理体系,包括数据存储的模型、数据组织的架构、数据分析的算法、数据管理的⼯具以及数据访问的接⼝等等。
举个例⼦,粮仓。如果你有1亩3分地,产的粮⾷刚刚够⼀家⼈吃,吃不完的⾃⼰个缸就放下了,这个缸也只需要⽅便⾃⼰家⼈使⽤就⾏了。随着你种的地越来越多⽐如1万亩地,⽣产的粮⾷根本吃不完,那就必须修建⼀个专门⽤来存放粮⾷的仓库,同时还要⽅便不同的商家来拉粮⾷,为了保证粮⾷存放的安全和效率,就必须对粮仓进⾏特殊的设计和处理,⽐如恒温恒湿、⾃动喷淋、传送系统等等。数据库也是类似的道理。
数据库起源于登⽉计划,因为需要⼤量的数据分析⼈员对⼤量的数据进⾏分析,就不得不开发⼀款能够⽅便更多⼈使⽤的数据管理分析软件。确实是⼈类当时的灯塔,研发出了多少好东西,不得不给NASA的⼯程师们点个赞。
2.数据库的核⼼功能是什么
数据库会根据应⽤场景的不同⽽分为不同的类别,⽐如最经典的分类OLTP(在线事务处理)和OLAP(联机分析处理)。举个例⼦,你每天要使⽤信⽤卡⽀付来坐地铁,买午餐、买饮料、上淘宝购物等等,这每⼀笔交易都需要后台数据库准确地记录下来,这个数据库就是OLTP类型。
你也会通过系统去查询你上个⽉的消费情况,系统会根据你上个⽉的交易数据做个汇总发给你,并告诉你吃饭花了多少、交通花了多少、娱乐花了多少等等,⽀持这个场景的就是OLAP类型。
OLTP主要处理短⼩的事务,要求事务吞吐量很⾼,因为每个⼈每天可能要⽀⼗⼏次,但每次需要处理的数据量⽐较⼩;⽽OLAP,每个⼈可能每个⽉只⽤⼀次,但是每次要处理的数据量相对⽐较⼤,⽽且计算⽐较复杂。
近年来,伴随着⼈⼯智能、物联⽹、边缘计算等数字化场景的兴起,数据库的功能也产⽣了更多的分类,如HATP(同时能够处理OLTP和OLAP的场景)、流式数据处理、时序数据处理、⾮结构化数据处理、跨平台数据处理、多模态数据处理等等。如何理解这些分类呢?
类似于不同功能的汽车,有货车,有客车,有MPV,有SUV,有⽪卡,有燃油车,有新能源车等等。车的核⼼功能是⼀致的,只是为了适应不同的场景和需求,不同的车会有不同的架构设计和调教,如此⽽已。
那么数据库应该有哪些核⼼功能呢?
陶大宇个人资料
罗紫琳个人资料⾸先,数据库、数据库,必须要把数据保存下来。要把数据按照合理的格式,安全保存在可持久化的存储介质⾥⾯,要保证数据的正确性、完整性和安全性。这是所有数据系统最核⼼的功能。换句话说,把数据交给数据库,数据库要保证数据不丢、不错。这个是最最起码的要求。正如粮仓,不能粮⾷存进去都发霉了,被耗⼦吃了。
其次,数据库要尽可能提⾼数据存取效率。要⽤更有效率的⽅式存储数据,让数据存储得更快,更易于使⽤者理解,更⽅便上层业务的使⽤。查询数据时效率更⾼,更快给出结果。就像有⼈来送粮⾷⼊库,要快速地称重、烘⼲、质检、打包、⼊库,不能让⼈家等⼀礼拜。有⼈要买⼩麦,有⼈要买⽟⽶,必须按照要求快速到相应的存放地点把粮⾷交给粮商。
出品时间
再次,数据库要提供丰富的数据分析算法,尽可能把跟数据密切相关的计算在数据库中完成,减少数据传输的开销,减轻上层业务逻辑的计算压⼒。就像粮库要提供完善的粮⾷处理措施,⽐如称重、烘⼲、打包、品质分级等,⽅便粮⾷交易。
最后,数据库要提供易于使⽤的接⼝,降低数据分析⼈员的使⽤门槛,能够⽀持各种数据分析⼯具,让使⽤数据更加⽅便。就像粮库要有⽅便的停车场、清晰的指⽰牌、专业友好的⼯作⼈员等。
3.数据库的核⼼组件有哪些
为了实现这些核⼼功能,通常数据库会包括以下核⼼组件:
法国小天后艾莉婕a. 存储管理
数据⽤什么样的⽅式来组织、存储,是key-value还是关系型,是按⾏存还是按列存,⽀不⽀持压缩,⽀不⽀持删除和修改,⽀持什么样的数据类型和存储接⼝,Posix还是对象存储。是否要⽀持计算存储
分离,是否要⽀持分布式存储,是否⽀持事物处理,是否⽀持多副本,采⽤什么算法来加速数据的检索(索引)等等。存储管理是数据库的核⼼组件,解决了存储管理问题,数据库的问题就解决了⼀半了。
b. 查询优化器
要提⾼数据查询的效率,数据库必须到⼀条最优化的执⾏路径,⽐如,查询时是否需要使⽤索引,如果有多个索引,应该选择哪⼀个,如果数据分布在不同的存储单元(表、集合等)⾥,应该按照什么顺序来访问效率最⾼等等。优化器⾯对的问题可能是⼀个极其复杂的路径规划问题,需要它在很短的时间⾥计算出最优路径,需要⼤量核⼼优化算法。属于数据库中复杂程度最⾼的部分。
坡道起步
举个例⼦,你要带着全家⼈,包括⽼⼈、⼩孩⼀起从上海去海南旅⾏,要制作⼀个性价⽐最好、家⼈满意度最⾼的计划,那么在计划时需要考虑哪些因素呢,⾸先,怎么去,是开车去,还是⽕车去,还是飞机去。开车,路上要花多久,中间需要休息⼏次,你和太太有没有时间,⽼⼈孩⼦是不是受得了,汽油费⽤,过路费⽤;飞机,怎么去机场,⾏李有多少,带不带的下,机票有没有打折,下了飞机怎么办等等。住什么酒店,去什么景点,⽼⼈喜欢去⼈多的⼈⽂景观,太太喜欢安静的地⽅和⽅便购物的地⽅,⼩孩喜欢有游乐场的地⽅,要不要酒店+景点⼀起订,会不会有优惠,要不要租车,租什么车…说到这⾥,是不是可以体会⼀个查询优化器需要考虑的问题有多少?
当然,这部分⼯作可以有相对简单的实现(基于规则),⽐如太太说了,时间确定、飞机来回、五星酒店、带私⼈沙滩。这样计划就会简单很多,也可以复杂到难以想象(基于机器学习、基于实际开销等等),太太说你全权负责,具体时间不确定,⼤概在8⽉-9⽉,要少花钱多办事,多做调研,⼀个最优⽅案。那么做这个计划就会⾮常复杂,需要的⽀持决策信息就会⾮常多。这样做出来的决策⼤概率相对会优化,⽐基于规则实现的计划能适应更多场景。
c. 执⾏模块
优化器做好了执⾏计划后,接下来就会有执⾏的模块按照执⾏计划对数据进⾏相关的计算,包括数据的存取、常规的加减乘除、排序、平均值、哈希,也会包括⼀些机器学习的算法,数据的压缩/解压缩,最后将计算完成的结果返回给客户端。
d. 内部管理和调度
数据库要正常的⼯作,还会需要⼀些内部协调管理的模块,⽐如,内存和存储同步,存储空间整理,元数据管理,集状态检测,容错和故障恢复等。
e. 管理⼯具和接⼝
为了提⾼易⽤性,数据库都需要提供⼀套管理⼯具,⽐如备份/恢复、状态检测、运⾏时监控、资源隔离、权限管理、安全审计、⾃定义接⼝、各种数据访问接⼝等。
4.数据库发展和展望
数据库的发展是伴随着计算机体系架构的发展⽽不断演进的,从主机,到个⼈电脑+⽹络(x86),到现在的云服务,数据库也经历了⼀系列的演化历程。
a. 主机时代
最初的计算机和数据库只是在航空航天、军事领域使⽤,只需要⽀持专业的数据分析⼈员进⾏数据分
析。到了上世纪70年代末,伴随着计算机进⼊更多的商业场景,产⽣了⼤量的数据分析的需求,数据库就需要⾯对更为普遍的⽤户需求。在IBM最早发布的关系型数据库的论⽂中,最强调的⼀点就是希望能够让数据库的⽤户不⽤再去操⼼数据应该如何存储和组织,⽽能够⾼效率使⽤这些数据进⾏分析。
为了⽅便⽤户的使⽤,SQL(结构化查询语⾔)被定义了出来,按照这样的语法,数据库⽤户只需要关注数据该如何分析,不需要关注底层的数据分布和存储等。
为了要⽀持⼤量⽤户的并发数据操作,数据库事务特性被定义了出来,保证在并发的数据操作下,⽤户能够看到符合业务逻辑的数据内容。
为了保证数据库的⾼效率和安全性,数据库重做⽇志(事务⽇志)被设计出来,包括当前数据库中经常出现的⼀系列概念,⽐如回滚⽇志(Undo Log)、提交⽇志(commit log)、检查点(checkpoint)等等。
主机时代由于硬件成本极其昂贵,不论是存储、内存还是CPU资源,相对来说都很稀缺,那么数据库在设计和使⽤上就会采⽤各种算法和架构来降低对内存的使⽤,减少数据的冗余,提⾼数据的检索效率,因此各种数据索引类型,功能强⼤的查询优化器,数据缓存算法等在数据库中得到了极⼤的发展。同时在使⽤数据库时,也要对数据进⾏各种复杂的模型设计(3范式模型,星型模型,雪花型模
型等等)以降低数据的冗余程度,当然这样也会增加数据库应⽤的开发难度。
张铎 陈松伶
b. x86时代
伴随着x86服务器的⼴泛使⽤和⽹络技术的发展,把N台x86服务通过⽹络组建成⼀个集,利⽤这个集的计算、存储能⼒来取代昂贵的主机也就更加具有性价⽐。在这种趋势下,也就设计出了各种能够使⽤集能⼒的分布式数据库系统,这些系统的核⼼思想就是把数据分散在不同的节点上,利⽤多个节点的计算和存储资源提⾼对数据的存储和分析能⼒。在分布式的处理架构下,数据⼀致性协议、多副本机制、⾼可⽤机制、数据分⽚机制、扩容/缩容机制等等也都成为了分布式数据库必须要设计和解决的问题。