licemiao 发表于 2023-10-8 14:00:38

想写一个国产的数据库,类似 mysql 这种现实吗?

想写一个国产的数据库,类似 mysql 这种现实吗?

muqinmuqin 发表于 2023-10-8 14:00:43

可以写一个 KV 数据库来过渡,不要一听说写数据库就觉得高大上,很困难。
但实际上不会,只需要熟悉基础语法,你也能写出一个硬核的项目!
我为大家带来了一个全新的系列课程 《从零实现 KV 存储》,采用 Rust 和 Go 两种语言实现,兼容 Redis 协议,并且是手把手教学,教学视频中会演示每一行代码的编写,保证你能够学懂学透!
并且只需要掌握基础的 Go 或者 Rust 语法知识即可,课程中涉及到的一些知识我都会详细的进行讲解。
关于课程详情,其他 Q&A 等,可以看这里:
https://w02agegxg3.feishu.cn/docx/Ktp3dBGl9oHdbOxbjUWcGdSnn3g

.silvanesw 发表于 2023-10-8 14:01:11

没有任何意义,别浪费时间了。

现在主流的几个数据库:MySQL,redis,MongoDB,各个操作系统的文件系统。

至于有些PB级别的存储数据库我个人是不建议去研究的,除非别人课题经费已经下来了,或者公司已经给你offer了。不然这玩意绝大多数公司用不到。

好好的掌握一下以上内容融汇贯通,之后无论是产业还是学术都有帮助。

别没事造轮子,别把自己当天才。

先承认自己的愚蠢,把已有东西都学会了,掌握透了,你再来谈微创新。

以上都是深刻的教训,我大学刚上数据库那会就觉得SQL很难用,于是我写了一个用csv实现的简单数据库,还自带了很多复杂关联查询和图表功能。但其实当初做的东西只是一个阉割版的SQLite,而我需要的只是一个把Python语法封装成SQL语句的api。这个小玩意还能在pip上找到,名为lzdb。

但其实如果当初有人能在我设计之初花几个小时和我讲讲当今世界的数据库产业格局,我就不会费这么多力气去做这玩意了。当时我还问过教授,教授:所以你想做pandas?
我当时也以为是pandas但其实不是,因为pandas会一次性把所有内容全读进内存。在大数据处理上会非常困难。

yaner 发表于 2023-10-8 14:01:52

真的想入行数据库研发,我不建议你去写一个数据库。
写一个数据库太简单了。DDIA(数据密集型应用)开篇,有用Shell、十几行代码,写过一个极简版数据库。有兴趣可以读读看。
真的想入行,找一个流行的开源数据库,去研究它的代码。研究它的代码比你自己写,收获会大很多。而且,更有用。
你花个一年半载的,写出来的玩意,除了你自己,不会有人去看一眼。研究大规模使用的、流行的开源数据库,就不一样了。要知道能被大规模使用、流行度高的数据库,都是大师之作。看大师为什么那样设计、为什么那么写代码。体会大师走过的路、踩过的坑。让大师深厚的内力,传输给你。
这个过程就像:

http://picx.zhimg.com/v2-c685b61bd91f90fb72d6d6b440581a0b_r.jpg?source=1940ef5c
练书法,有个重要过程,就是临摹。临摹到一定程度,你就会有自己的东西。
临摹谁呢?大规模使用的、流行度高的。目前,符合这个标准的,基本也就MySQL/PostgreSQL。MongoDB也可以,小型的内存数据库Redis也不错,代码量少。
SQLite不太建议,用的是很广。但都是免费用。你研究它,将来不好变现。
个人更建议PostgreSQL,代码可读性高。上手更容易。使用的也很广泛,有研究成果了,变现也容易。现在真的精通PG内核代码的话,年薪百万还是松松的。

czp820401 发表于 2023-10-8 14:02:23

两个简单的方向吧。一个是给mysql写个存储引擎,另一个是基于mysql的协议写个兼容后端实现。以下mysql一词是概称,包含mariadb,原版mysql等等各类兼容实现。
存储引擎

存储引擎的思路是一些做数据库的公司和互联网大厂里的早期思路。使用mysql的SQL引擎之类的。把结构体里实现一些必要的接口就行。可以按自己的需求来优化存储引擎的应用方向。比如可以做个一开始就做好高度索引优化的只读数据库,就不用担心索引更新之类的麻烦事了。
以下是我几年前研究MySQL存储引擎时的笔记。我并不看好这个方向,所以做完技术调研后,并未深入做实验。
是按照MySQL约定,提供某些接口实现。比如插入记录就会调用 write_row() 方法,通过索引检索时调用 index_read() 和 index_next() 方法。
MySQL与存储引擎之间的接口主要通过两个类实现 sql/handler.h 中的 handlerton 和 handler 类。前者约定事务操作接口,后者是表、索引、记录操作接口。对不支持事务的存储引擎只需要创建handler的子类,并重载方法实现即可。
实现了存储引擎后,还需要声明一下存储引擎的存在,定义一个 st_mysql_storage_engine 变量,值为 MYSQL_HANDLERTON_INTERFACE_VERSION ,如下:
struct st_mysql_storage_engine foo_storage_engine={
    MYSQL_HANDLERTON_INTERFACE_VERSION
};然后调用 mysql_declare_plugin() 宏来给出存储引擎声明:
mysql_declare_plugin(foo){          /* foo为存储引擎名称 */
    MYSQL_STORAGE_ENGINE_PLUGIN,
    &foo_storage_engine,            /* 这里即为上面定义的st_mysql_storage_engine变量 */
    "FOO",                        /* SHOW ENGINES中显示的存储引擎名称 */
    "Author Here",                  /* 作者名 */
    "Foo storage engine",         /* SHOW ENGINES中显示的存储引擎说明 */
    PLUGIN_LICENSE_GPL,
    init_func,                      /* 某函数,将在加载存储引擎时调用 */
    done_func,                      /* 某函数,将在卸载存储引擎时调用 */
    0x0001 /* 版本号0.1 */,
    NULL,                           /* status variables */
    NULL,                           /* system variables */
    NULL                            /* config options */
} mysql_declare_plugin_end;这样声明后,加载存储引擎时MySQL将调用 init_func() 函数,传入handlerton变量。存储引擎至少要设置 state 、 db_type 、 create 、 flags 等属性,其中create是函数指针。若支持事务还需要设置handlerton中事务接口的实现函数。
MySQL源码里的 storage/example/ 包含一个例子,可以参考或直接修改。
兼容协议

简单的说,写一个网络协议上兼容的服务器。把用户提交的字符串(原本应该是SQL语句),做了必要处理后,返回用户以数据集或异常信息。
我知乎文章里就有多年前翻译的协议文档。
MySQL的通信协议PostgreSQL通信协议memcache通信协议我的github里也有多年前基于pgsql协议写的兼容服务器,当作RPC协议来用的。
GitHub - gashero/magicrpc: Automatically exported from code.google.com/p/magicrpc小结

总的来说,国内已经有很多公司和个人写过数据库了,难度也不高。新手用来练习一下是个有趣的例子。尤其是兼容协议的实现,当发现自己用标准的mysql客户端连接到自己的服务器,发个hello,得到个world时还是很好玩的。

ytey3j47r4 发表于 2023-10-8 14:03:14

谢邀,重度参与过 OLTP(MySQL) 和 OLAP(ClickHouse) 的内核研发,手写过好几个数据库原型,正好借这个问题谈谈个人的一些感受。
首先可以确定的是:数据库方向是非常有前(钱)途的,是门手艺活,学好可以吃一辈子(还可以传承到下一代)。
CPU/操作系统/数据库三大基础软件中,数据库是个人/小公司最有条件先做起来的。
数据库还有一个重要的地方:非常迷人,一旦入门,一发不可收拾,我是从十多年前一路狂奔到现在,每周都会写上一些内核代码。
另外一个问题是要实现一个 MySQL:如果作为原型练练手是没问题的,如果抱着去实现一个国产化的 MySQL 意义并不是很大。说实话,MySQL 只是一个数据库产品,经历过这么多年的发展和迭代,它不是一个好的工程产品,而且很多地方设计的并不合理。
从技术层面讲,数据库是一个人体工程产品,理论方面短期内很难再有大的突破了,单从索引技术方面,从 B-Tree 到最先进的 Fractal-Tree,其实也就是一个常数项的优化。所以我们要做的就是先把基础打磨好,比如通过实现一个 MySQL 原型来触及: parser -> planner(MySQL 这方面比较弱) --> storage。
Good luck!
页: [1]
查看完整版本: 想写一个国产的数据库,类似 mysql 这种现实吗?