一个小型数据库的核心组件
而从目前实际的发展来看,基本上目前发展的核心思路并没有绕开人们在数据库理论领域内所积累的那些关键的特性。因此,如果你希望能够快速的在海量数据的在线处理领域内积累知识,从传统数据库领域入手是绝对不会错的。
下面,就让我们对数据库做个简单的解刨,看看数据库里面有哪些核心的组件吧。
映射(Map):
首先就需要有能够存储数据并提供查询的结构,这个结构,在java里面就是Map。 C里面也是Map.他的核心作用就是,建立一种key与value的映射关系,当给定某个key的时候,他能够返回这个key所对应的value给用户。这是用户在进行查询时的主要数据结构。
预写式日志(write-ahead logging,WAL):
就是个队列,记录了你每一次写的操作。自然而然的,因为你的每次写操作都被记录下来了,所以就算计算机断电了,只要这个日志没有损坏,计算机重启后按照这个log ,重放在断电时的那些写操作,就可以保证你的数据不丢。
这里,一定会有人问:既然我数据都存储在k-v表里了,明显就不会丢失了。为什么还要有这个log呢?这其实就是一个计算机的本质性问题了,别看现代计算机运算速度这么快,他终归也只是个“图灵机”实现,或者更具象化一点,就是一台打字机,一次只能打一个字母,那么可能会有人问了,如果我要用几个字母来表示同一个意思,应该怎么做呢? 在英语中,最简单的方式就是在词组和词组之间增加空格。 比如write ahead logging. 就是三个由字母组成的单词。在计算机里,也有类似的问题,用户的一次写入操作,可能对应计算机内的多步操作,如何能够保证这多次的操作要么全部成功,要么全部失败呢? WAL就是个解决的方法,他利用的是操作系统里的一个原子操作fsync(). 该操作的作用是将一小段数据写入到磁盘,从而保证数据不会丢失。
我们来看一下整体的操作思路: 记录用户的写入操作(insert,update,delete)-> 进行内部多次key-value映射的构建,包括主数据,辅助索引数据等-> 标记该用户操作完成。
触发器(trigger)
一个不难理解的概念,当发生insert , update , delete等操作的时候,可能会有一些需求需要依托这些操作而被触发执行其他的操作。比如每一行针对表A的更新,都会引发B表内的更新。那么 这个“引发”的过程,就是触发器。在一些其他的语言里面,这也被叫做callback,IFTTT,Listener等。 但核心概念都一样,被动的因为某个事件而触发一段代码逻辑的运行。
在一些数据库的实现中,甚至二级索引的更新也是使用触发器来完成的哦:)
在数据库内,触发器全部是同步实现的,也就是说,只有当数据写入的操作,以及触发器的操作全部都执行完成后,才会返回用户执行成功。
锁(lock)
锁的主要目标是允许线程圈定一批资源,并规定该资源只允许发出圈定请求的那个线程进行访问,而其他线程则必须等待。
这个概念产生的主要原因其实还是与计算机是图灵机有关。。本来计算机就是台图灵机,一个时钟周期内只能打一个字母,但这样他就很难同时做好几件事情,比如听着歌写代码,这件事其实从计算机硬件来说是做不到的,他只能模拟,利用时分复用的方式,把cpu的运算分解成小片,每个线程都只占用一小段时间,从而能够做到同一时间做好几件事。但是,想一想,如果我们希望一个人A用打字机打i am god. 而希望另外一个人B用同一台打字机打 pig is money. 开始,时间片分配给A,他打印了i am后,A被cpu换出,B被换入,打印了pig 后被其他人换出, 那么我们自然就发现。。数据就变成了。。。 那么锁的作用就是保证一个逻辑的原子操作没有完结的时候,这张打印纸只属于A,其他人不能对其进行访问或进行修改。
明白了原理,来简单看看实现,锁主要是由排他锁(写锁)和共享锁(读锁)构成,在数据库的锁实现中,有很多针对共享锁和排他锁相互组合的细节性描述,但其核心的问题却永远没变:
1) 尽可能的减少同一时间内被阻塞的线程数,从而提升并行度。
2) 尽可能的避免死锁
可以说数据库实现的是好是坏,关键就看着锁的优化好不好,这在分布式场景或者在单机内都是最重要的一个机制。
执行优化器
这是关系数据库得名的原因,主要的作用是将关系查询转换成key-value 查询,输入是sql的抽象语法树(ast),输出则是执行计划,就是各位在数据库命令行打explain sql时候出来的那些东西。
理解上很简单,但实际上实现起来却是最为复杂的,在上个世纪,大部分的执行优化器使用rule based optimizer,也就是基于规则的优化,但在现代数据库实现中,大部分的优化器都采取了cost based optimizer了,他们之间最大的不同,就是cbo更多的考虑了数据实际的区分度情况,从而能更简单准确的从。多个可选的索引中选择一个正确的索引。
sql解析器
作用很简单,把用户输入的sql转化为计算机可以理解的抽象语法树(不懂就去看编译原理:)
好了,基本组件儿介绍完毕,下面我们利用这些核心组件来尝试拼装一些外围的概念。
一个小型数据库的核心组件相关推荐
- 用mysql做小型数据库,怎样用excel制作一个小型数据库表格 | excel做数据库
Excel 表格类似的数据结构,数据库应该如何设计 想想一个三维的空间: x,y,z 分别表示坐标的 x,y,z 值,为整数(可以为负,如果你在应用里面将0设中点,且允许反方向存储数据的话,x,y 表 ...
- 实现一个小型数据库--记一次中级软件设计实作浮沉历程
说在前头:本篇文章主要是记录这次项目的过程,不全是贴代码,具体的程序移步这里,不喜欢的同学请轻喷. 事件起因:大三狗一枚,专业是软件应用.这学期的中级软件设计实作题目是实现一个小型的数据库,具体的题目 ...
- 南邮数据库实验2:小型数据库设计
题目:自己设计一个小型数据库. 个人比较喜欢看电影,于是用Python爬了豆瓣Top250的电影,做了一个关于电影的小型数据库,这里只举一小部分作为例子. 关系模式: 电影名称关系模式 TITLE(M ...
- 【python基础】用字典做一个小型的查询数据库
例子来源于<python基础教程>第三版,57p 该例子主要是使用字典的方式,实现一个小型的数据库,通过查询字典的键值来获取用户的信息. 本人修改了部分代码. #!/usr/bin/pyt ...
- 开发定制一个属于自己的小型数据库
一直很想开发个属于自己的小型数据库,并经历了一段时间的准备和学习,大致开发出了一个小型的数据库,这里主要介绍下核心代码的实现. 数据库的核心就是指针链表的使用和其算法的实现,关键就是对链表的灵活运用, ...
- 如何使用XML作为小型数据库
如何使用XML作为小型数据库? 首先,我们以下面的user.xml作为我们所要使用的xml文件,具体内容如下: <?xml version="1.0" encoding=&q ...
- 模仿写一个小型网站框架
之前的博文中讲述MVC的时候,介绍了美女同学的简单框架one.本来就打算要在美女框架的基础上有所改进,至少能够独立搭出一个成型的小网站出来(有界面交互,有db读写等).刚好最近工作内容不同,故借此机会 ...
- 小型数据库_如果您从事“小型科学”工作,那么您是否正在利用数据存储库?
小型数据库 If you're a scientist, especially one performing a lot of your research alone, you probably ha ...
- python开发小型数据库_python web开发之数据库ORM的 peewee库 动手学习实践笔记
背景 在web开发的时候,一些比较简单的小型系统其实也得ORM框架,显而易见其实开发速度上是提升很多,因为有必要学习一下对应的ORM库. 关于ORM一些说明 关于ORM(Object Relation ...
最新文章
- 【清华大学龙明盛副教授】迁移学习理论与算法
- 网页同步交互和异步交互的区别?
- 6个步骤卸载wine
- [能力提升][费曼学习法]学习方法
- jQuery迷你帮助查找功能
- 处理SQL Server中的重复行
- ArcGIS制图表达Representation-制图表达原理
- 【优化预测】基于matlab差分优化灰狼算法优化支持向量机SVM预测【含Matlab源码 1576期】.zip
- 简单说下H5+打包apk
- MES系统最全介绍来了
- windows无法打开添加打印机_打印机常见故障机及处理方法
- 从头开始阅读PyTorch代码 -- Operators篇
- YUV420P像素数据编码为JPEG图片
- 武大2020/4/15-关于选派全日制在校生2020/2021学年秋季赴部分欧洲高校交流学习的通知(三)
- vue自定义数字键盘
- js版【微信机器人】——wechat-robot
- 【计算机网络】物理层 : 相关参数 ( 码元 | 码元进制 | 速率 | 码元传输速率 | 波特 | 信息传输速率 | 带宽 | 码元速率计算示例 )★
- mysql脏读,幻读,不可重复读以及间隙所解决幻读
- vim资源很全的一个网站
- FS4068四节锂电池充电管理控制芯片
热门文章
- 三维重建13X-2:FCN和MaskRCNN中Mask的获取
- 安卓项目中文件夹的作用
- undefined reference to “boost” in Qt—Ubuntu
- java B2B2C Springboot电子商城系统
- 美一8岁华裔男童体育课上头部重伤 家长吁调查
- 漫画|你还记得原生的JDBC怎么连接数据库吗?
- 日志分析工具ELK(一)
- Docker Java+Tomcat 环境搭建
- CakePHP 2.10.17 发布,PHP 快速开发框架
- ROC和AUC介绍以及如何计算AUC(转载+自己重新排版整理)