从零实现一个数据库(DataBase) Go语言实现版 0.介绍

这篇具有很好参考价值的文章主要介绍了从零实现一个数据库(DataBase) Go语言实现版 0.介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

英文源地址

数据库实现步骤细分

1.持久化(Persistence)

我们为什么需要数据库?为什么不是直接把数据dump进文件中.
第一个话题就是持久化.
我们将讨论如果写入文件的过程中程序崩溃了, 或者电源断电了, 文件的状态会是什么样的呢?

  • 文件是否只是丢失了最后一次写操作?
  • 或者以写了一半的文件结束
  • 或者是以更差的状态结束

任何结果都有可能.当你仅仅是简单写入文件的话, 你的数据并不能保证会持久化到磁盘上. 这对数据库是至关重要的.而且数据库在一次意外宕机后将会恢复到可用的状态.
我们是否有办法不适应数据库而做到持久化呢? 是有办法的:

  1. 将所有更新的数据集写入一个新文件
  2. 在新文件上调用fsync
  3. 通过将新文件重命名为旧文件的方式覆盖旧文件, 这在操作系统层面是原子操作.

这只有当数据集很小的时候才是可行的.像SQLite这样的数据库可以做增量更新

2.索引(Indexing)

有两种不同类型的数据库查询: 分析式的(OLAP) 和 事务式的(OLTP). (这里补充一个链接, 数据库是OLTP应用的场景, 数据仓库是OLAP的应用场景: OLAP/OLTP)

  • 分析式查询(OLAP)通常涉及巨量的数据, 会使用聚合, 分组或者join连接操作
  • 相比之下, 事务式查询(OLTP)通常只使用少量的索引数据. 最普遍的查询类型是索引的位置查询或索引的范围查询.

注意单词’transactional’和你知道的数据库事务并无联系.计算机领域的术语常常会涵盖多种不同的涵义.本文关注的焦点在与OLTP技术.
当需要应用不是实时(real-time)系统时, 大多数面向用户的软件应当在合理(小)的时间内做出响应, 并使用合理的资源总量(内存, IO).这些属于OLTP的范畴.我们如何快速地查找数据(在Ologn内), 即使数据集是巨大的情况下?这就是我们需要索引(indexes)的原因.
如果我们忽视持久化的层面并且假设数据集很适合存在内存中, 快速地找到数据就是一个数据结构地问题. 持久化存在磁盘上的,用于查找数据的数据结构在数据库系统中就称为索引(indexes).而且数据库索引的大小可以超过内存的大小.这也就是说,如果你的问题适合使用内存解决, 那就是个比较容易的问题.
一般索引的数据结构使用B树(B-Trees)或者LSM树(LSM-Trees).

并发性

现代应用并不是顺序地做任何事情的, 数据库也是.有不同级别的并发性:

  • 在读操作之间的并发性
  • 在读操作与写操作之间的并发性, 写操作是否需要独占数据库呢?

即使是基于文件的数据库SQLite也支持一些并发性. 但并发性在一个进程中更易实现, 也是为什么大多数数据库系统只能通过一个’server’服务端访问.
加入了并发性后, 应用经常需要原子地做某件事, 比如读-修改-写操作.这为数据库引入了新的概念: 事务(transactions).文章来源地址https://www.toymoban.com/news/detail-456006.html

到了这里,关于从零实现一个数据库(DataBase) Go语言实现版 0.介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一个退役中校教你如何用go语言写一个基于B+树的json数据库(进阶篇)之json字符串解析为BsTr结构(一)

    1.对象式json字符串 s := \\\"{\\\"put\\\":{\\\"putjsontest\\\":{\\\"aaa\\\":\\\"sdftsdfs\\\\dfe29asdf\\\",\\\"aaab\\\":true,\\\"arrarrstrct\\\":{\\\"nnn\\\":-1234567890,\\\"ccc\\\":[[\\\"sdftsdfs\\\\dfe29asdf\\\",\\\"nmbndfvdfgfdg\\\"],[\\\"sdftsdfs\\\\dfe29asdf\\\",\\\"poiuiyyttt\\\"]]},\\\"ddd\\\":\\\"sdftsdfs\\\\dfe29asdf\\\",\\\"fff\\\":false,\\\"comboolarr\\\":[{\\\"boolarr0\\\":[true,false]},{\\\"boolarr1\\\":[true,false]}]}

    2024年02月21日
    浏览(36)
  • 如何使用 .Net Core 实现数据库迁移 (Database Migration)

    当我们在编写基于数据库的应用程序时,随着需求的增加和改变,我们需要升级我们的数据库,变更数据库表的字段,当我们的系统的不同版本被部署到了不同的客户那里,在需要给客户升级时,我们如何实现数据库模式 (schema) 的自动升级呢? 传统的管理办法是针对每个数

    2024年02月05日
    浏览(41)
  • Database Connection Pool 数据库连接池-01-概览及简单手写实现

    第一节 从零开始手写 mybatis(一)MVP 版本。 第二节 从零开始手写 mybatis(二)mybatis interceptor 插件机制详解 第三节 从零开始手写 mybatis(三)jdbc pool 从零实现数据库连接池 第四节 从零开始手写 mybatis(四)- mybatis 事务管理机制详解 由于数据库连接得到重用,避免了频繁创

    2024年03月14日
    浏览(83)
  • Go语言操作MySql数据库

           go-sql-driver/mysql库是Go语言官方推荐的MySQL驱动库,可以很方便地实现对MySQL数据库的连接和操作。本文记录一下使用go-sql-driver/mysql数据库驱动来操作mysql数据库。 目录 1.安装驱动程序 2.导入驱动包 3.操作数据库 3.1 获取mysql版本 3.2 创建表 3.3 表中插入数据 3.4 表中删除

    2024年02月07日
    浏览(28)
  • Go语言(Golang)数据库编程

    要想连接到 SQL 数据库,首先需要加载目标数据库的驱动,驱动里面包含着于该数据库交互的逻辑。 sql.Open() 数据库驱动的名称 数据源名称 得到一个指向 sql.DB 这个 struct 的指针 sql.DB 是用来操作数据库的,它代表了0个或者多个底层连接的池,这些连接由sql 包来维护,sql 包会

    2024年02月03日
    浏览(45)
  • 【PostgreSQL 数据库技术峰会(成都站)】云原生虚拟数仓 PieCloudDB Database 的架构和关键模块实现...

    2023年6月17日,中国开源软件推进联盟 PostgreSQL 分会在成都举办了数据库技术峰会。此次峰会以“新机遇、新态势、新发展”为主题,结合当下信创热潮、人工智能等产业变革背景,探讨 PostgreSQL 数据库在这些新机遇下的发展前景。峰会邀请众多行业大咖、学术精英、技术专家

    2024年02月11日
    浏览(38)
  • 001- database - 数据库

    1、新的数据库进入默认有四个数据库,一般不要轻易删除; -- 创建数据库 CREATE DATABASE 数据库名 -- 查询所有数据库 SHOW DATABASES -- 使用数据库 -- USE 数据库名 -- 查询当前使用的数据库 SELECT DATABASE() -- 删除数据库 DROP DATABASE 数据库名

    2024年02月17日
    浏览(36)
  • IDEA连接database数据库

    如果没有配置驱动,将会报如下错误 从maven仓库下载:要求联网 将提前下载好的jar放到本地目录 将提前准备好的mysql驱动jar包,放到Idea配置路径中:C:UsersIrene.IntelliJIdea2019.2configjdbc-drivers 解决办法:手动增加高级参数 serverTimezone=Asia/Shanghai

    2024年02月20日
    浏览(42)
  • create database创建数据库失败

    瀚高数据库 目录 环境 症状 问题原因 解决方案 环境 系统平台:Linux x86-64 Red Hat Enterprise Linux 7 版本:4.5.7 症状 1、执行如下sql语句创建数据库报错。 问题原因 1、初始化数据库的时候指定了参数locale、lc-collate、lc-ctype、lc-messages的值为’C’,即数据库默认模板template1对应这些

    2024年02月17日
    浏览(35)
  • MySQL数据库(database)相关操作

    修改my.ini配置文件,可修改MySQL默认的字符集. 修改[mysql]选项组下的default_character_set的值可以同时改变character_set_client, character_set_connection, character_set_database的值 修改[mysql]选项组下的character_set_server的值可同时改变character_set_database, character_set_server的值 在MySQL命令行通过以下命令

    2024年02月05日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包