免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 27366 | 回复: 30
打印 上一主题 下一主题

[其他] 数据库核心开发知多少--大家一起来写数据库引擎(获奖名单已公布-9-25) [复制链接]

论坛徽章:
49
15-16赛季CBA联赛之福建
日期:2016-06-22 16:22:002015年亚洲杯之中国
日期:2015-01-23 16:25:12丑牛
日期:2015-01-20 09:39:23未羊
日期:2015-01-14 23:55:57巳蛇
日期:2015-01-06 18:21:36双鱼座
日期:2015-01-02 22:04:33午马
日期:2014-11-25 09:58:35辰龙
日期:2014-11-18 10:40:07寅虎
日期:2014-11-13 22:47:15申猴
日期:2014-10-22 15:29:50摩羯座
日期:2014-08-27 10:49:43辰龙
日期:2014-08-21 10:47:58
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-19 09:23 |只看该作者 |倒序浏览
获奖名单已公布,详情请看:http://bbs.chinaunix.net/thread-4099837-1-1.html

数据库应用项目是通过数据库引擎与数据库链接的。何为数据库引擎呢?简而言之,数据库引擎就是驱动各种数据库的程序,它负责处理数据库相关工作的整个核心部份。同样的,数据库应用项目的操作指令,均会通过数据库引擎的处理作用到数据库上。国内同行做数据库核心引擎开发方面工作还是比较少的。大家更多的是停留在熟练使用和部分代码的修修补补上。

想必大家在国内各种技术社区和大会上都见过,各种对Oracle内幕,比如块构造,隐藏参数等津津乐道,对于调整好一条SQL语句使之在甲骨文的优化器下能高性能运转而感到成就感十足。在开源数据库技术方面,大家则热衷于在开源代码上修修改改来满足自己的业务需求。

但是您有想过自己来试一下,从头开发一个完整的数据库么?
比如从头创建一个Linux下简易分布式文档型数据库?
欢迎大家加入我们的讨论!


如果您对NoSQL技术选型方面想更多了解,欢迎参与我们的有奖调查活动NoSQL和大数据技术大调查,欢迎大家参与!

如果您对这样的挑战没有概念,您可以看一下这个:ITPUB资深版主wangzhongnew的一个学习课程:http://www.dataguru.cn/article-3165-1.html

本期话题:
1、您尝试阅读过哪些数据库的代码,您的感受是什么?
2、如果您来参与开发数据库引擎,您认为难点在哪?
3、NoSQL等分布式数据库和现在主流的RDMS的思想上有何差别?

本期嘉宾:
ITPUB资深版主:wangzhongnew,毕业于加拿大卡尔加里大学,于2005年在IBM多伦多实验室进行DB2数据库的研发与技术支持,并参与设计IBM下一代弹性数据平台。2012年创立SequoiaDB巨杉NoSQL数据库并担任总架构师与首席技术官。

活动时间:
2013年8月18日-9月10日

活动奖品:
分享最精彩的Cuer将获得价值300元的罗技K400无线触控键盘一个,共一个
最佳参与分享Cuer将获得价值100元的无线路由一个,共5个


更多活动内容,请关注ChinaUnix官方微信!


论坛徽章:
0
2 [报告]
发表于 2013-08-19 10:34 |只看该作者
本帖最后由 xike2002 于 2013-09-02 16:13 编辑

mark一下,下来补充。

1、您尝试阅读过哪些数据库的代码,您的感受是什么?
答:数据库的引擎技术和存储技术是当今时代的大家非常关心的东西。曾经下载过MYSQL的源码,真心感觉编写和设计这些代码人的功力太深了,可能还是因为阅历不够,无法完全理解所有的代码,只能继续修炼内功不断的提高,有机会在品读MYSQL源码。

2、如果您来参与开发数据库引擎,您认为难点在哪?
答:我觉得任何一种数据库引擎的开发都不容易,需要付出很多的努力!

你能用的数据库引擎取决于mysql在安装的时候是如何被编译的。要添加一个新的引擎,就必须重新编译MYSQL。在缺省情况下,MYSQL支持三个引擎:ISAM、MYISAM和HEAP。另外两种类型INNODB和BERKLEY(BDB),也常常可以使用。

下面看一下几种常用的引擎。
ISAM
ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不支持事务处理,也不能够容错:如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MYSQL能够支持这样的备份应用程序。
MYISAM
MYISAM是MYSQL的ISAM扩展格式和缺省的数据库引擎。除了提供ISAM里所没有的索引和字段管理的大量功能,MYISAM还使用一种表格锁定的机制,来优化多个并发的读写操作。其代价是你需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MYISAM还有一些有用的扩展,例如用来修复数据库文件的MYISAMCHK工具和用来恢复浪费空间的MYISAMPACK工具。
MYISAM强调了快速读取操作,这可能就是为什么MYSQL受到了WEB开发如此青睐的主要原因:在WEB开发中你所进行的大量数据操作都是读取操作。所以,大多数虚拟主机提供商和INTERNET平台提供商只允许使用MYISAM格式。
HEAP
HEAP允许只驻留在内存里的临时表格。驻留在内存里让HEAP要比ISAM和MYISAM都快,但是它所管理的数据是不稳定的,而且如果在关机之前没有进行保存,那么所有的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费大量的空间。HEAP表格在你需要使用SELECT表达式来选择和操控数据的时候非常有用。要记住,在用完表格之后就删除表格。
INNODB和BERKLEYDB
INNODB和BERKLEYDB(BDB)数据库引擎都是造就MYSQL灵活性的技术的直接产品,这项技术就是MYSQL++ API。在使用MYSQL的时候,你所面对的每一个挑战几乎都源于ISAM和MYISAM数据库引擎不支持事务处理也不支持外来键。尽管要比ISAM和MYISAM引擎慢很多,但是INNODB和BDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。如前所述,如果你的设计需要这些特性中的一者或者两者,那你就要被迫使用后两个引擎中的一个了。

3、NoSQL等分布式数据库和现在主流的RDMS的思想上有何差别?
答:NOSQL系统一般都会宣传一个特性,那就是性能好,然后为什么呢?关系型数据库发展了这么多年,各种优化工作已经做得很深了,NOSQL系统一般都是吸收关系型数据库的技术,然后,到底是什么因素束缚了关系型数据库的性能呢?我们从系统设计的角度看这个问题。

(1) 索引支持。关系型数据库创立之初没有想到今天的互联网应用对可扩展性提出如此高的要求,因此,设计时主要考虑的是简化用户的工作,SQL语言的产生促成数据库接口的标准化,从而形成了Oracle这样的数据库公司并带动了上下游产业链的发展。关系型数据库在单机存储引擎支持索引,比如Mysql的Innodb存储引擎需要支持索引,而NOSQL系统的单机存储引擎是纯粹的,只需要支持基于主键的随机读取和范围查询。NOSQL系统在系统层面提供对索引的支持,比如有一个用户表,主键为user_id,每个用户有很多属性,包括用户名,照片ID(photo_id),照片URL,在NOSQL系统中如果需要对photo_id建立索引,可以维护一张分布式表,表的主键为<photo_id, user_id>形成的二元组。关系型数据库由于需要在单机存储引擎层面支持索引,大大降低了系统的可扩展性,使得单机存储引擎的设计变得很复杂。

(2)事务并发处理。关系型数据库有一整套的关于事务并发处理的理论,比如锁的粒度是表级,页级还是行级,多版本并发控制机制MVCC,事务的隔离级别,死锁检测,回滚,等等。然而,互联网应用大多数的特点都是多读少些,比如读和写的比例是10 : 1,并且很少有复杂事务需求,因此,一般可以采用更为简单的copy-on-write技术:单线程写,多线程读,写的时候执行copy-on-write,写不影响读服务。NOSQL系统这样的假设简化了系统的设计,减少了很多操作的overhead,提高了性能。

(3)动态还是静态的数据结构。关系型数据库的存储引擎总是一颗磁盘B+树,为了提高性能,可能需要有insert buffer聚合写,query cache缓存读,经常需要实现类似Linux page cache的缓存管理机制。数据库中的读和写是互相影响的,写操作也因为时不时需要将数据flush到磁盘而性能不高。简而言之,关系型数据库存储引擎的数据结构是通用的动态更新的B+树,然而,在NOSQL系统中,比如Bigtable中采用SSTable + MemTable的数据结构,数据先写入到内存的MemTable,达到一定大小或者超过一定时间才会dump到磁盘生成SSTable文件,SSTable是只读的。如果说关系型数据库存储引擎的数据结构是一颗动态的B+树,那么SSTable就是一个排好序的有序数组。很明显,实现一个有序数据比实现一个动态B+树且包含复杂的并发控制机制要简单高效地多。

(4)Join操作。关系型数据库需要在存储引擎层面支持Join,而NOSQL系统一般根据应用来决定Join实现的方式。举个例子,有两张表:用户表和商品表,每个用户下可能有若干个商品,用户表的主键为<user_id, item_id>,用户和商品的关联属性存放在用户表中,商品表的主键为item_id,商品属性包括商品名,商品URL,等等。假设应用需要查询一个用户的所有商品并显示商品的详细信息,普通的做法是先从用户表查找指定用户的所有item_id,然后对每个item_id去商品表查询详细信息,即执行一次数据库Join操作,这必然带来了很多的磁盘随机读,并且由于Join带来的随机读的局部性不好,缓存的效果往往也是有限的。在NOSQL系统中,我们往往可以将用户表和商品表集成到一张宽表中,这样虽然冗余存储了商品的详细信息,却换来了查询的高效。

论坛徽章:
0
3 [报告]
发表于 2013-08-19 11:39 |只看该作者
这个必须的帮顶,可惜功力不高啊,刚毕业的时候还特地下载了一个微型的java的数据库打算啃啃源码,但是 一直啃不动。

论坛徽章:
40
水瓶座
日期:2013-08-15 11:26:422015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之乌兹别克斯坦
日期:2015-03-27 14:01:172015年亚洲杯之约旦
日期:2015-03-31 15:06:442015亚冠之首尔
日期:2015-06-16 23:24:37IT运维版块每日发帖之星
日期:2015-07-01 22:20:002015亚冠之德黑兰石油
日期:2015-07-08 09:32:07IT运维版块每日发帖之星
日期:2015-08-29 06:20:00IT运维版块每日发帖之星
日期:2015-08-29 06:20:00IT运维版块每日发帖之星
日期:2015-10-10 06:20:00IT运维版块每日发帖之星
日期:2015-10-11 06:20:00IT运维版块每日发帖之星
日期:2015-11-10 06:20:00
4 [报告]
发表于 2013-08-19 12:43 |只看该作者
本帖最后由 forgaoqiang 于 2013-08-19 12:46 编辑

目前对于数据库系统还处于使用和优化阶段,不具有开发能力,倒是对数据库引擎有一些了解,分享下我所知道的一些内容吧~~
话说,斑竹给的学习地址链接是个广告啊 要收费的样子~~


1、您尝试阅读过哪些数据库的代码,您的感受是什么?
2、如果您来参与开发数据库引擎,您认为难点在哪?
3、NoSQL等分布式数据库和现在主流的RDMS的思想上有何差别?

Editing & Lunching~~

论坛徽章:
4
CU十二周年纪念徽章
日期:2013-10-24 15:41:34摩羯座
日期:2013-12-24 13:05:332015亚冠之西悉尼流浪者
日期:2015-10-09 16:03:47fulanqi
日期:2016-06-17 17:54:25
5 [报告]
发表于 2013-08-19 17:25 |只看该作者
本帖最后由 hbsycw 于 2013-08-19 17:26 编辑

好话题,积极参与下,抛砖引玉:

1、您尝试阅读过哪些数据库的代码,您的感受是什么?
答:信息化时代,数据的持久存储应该是一切应用的基础,而数据库就是数据存储管理自动化的结晶。从开始接触软件开发,就在不断接触数据库,从简单的桌面数据库ACCESS到大的关系数据库MS SQLServer\Oracle\DB2等, 现在比较喜欢用的是MySQL,曾经尝试下载过源代码来看,感觉还是需要在计算机基础:数据结构和算法上下功夫。

2、如果您来参与开发数据库引擎,您认为难点在哪?
答:数据库引擎是一个数据库的核心功能实现。如果,我来参与开发,我想,第一步应该是功能定位。这里以MySQL来说,MySQL有多种引擎实现MyISAM\Innodb\MERGE\MEMORY(HEAP)\BDB(BerkeleyDB) 等,功能各不相同,难点应该还是在于,性能和功能的设计平衡。

3、NoSQL等分布式数据库和现在主流的RDMS的思想上有何差别?
答:NoSQL数据库简单说是KEY-VALUE存储,和关系型数据库的思想区别上,应该是简化了关系,而提高了存取效率。

论坛徽章:
1
戌狗
日期:2013-10-24 17:31:55
6 [报告]
发表于 2013-08-19 21:09 |只看该作者
1、您尝试阅读过哪些数据库的代码,您的感受是什么?
尝试阅读mysql,但太大,c、c++功力不够,还有就是单枪匹马,很难,没看出所以然。
2、如果您来参与开发数据库引擎,您认为难点在哪?
我觉得是定位及架构设计最难。首先要找出你的位置,要有需求,然后才是架构设计要好,后续的模块化开发,系统的扩展性才能好。
3、NoSQL等分布式数据库和现在主流的RDMS的思想上有何差别?
差别主要在于acid。nosql通过弱化某些方面来提升性能或扩展性,这是由acp理论决定了的平衡

论坛徽章:
10
CU大牛徽章
日期:2013-09-18 15:20:48程序设计版块每日发帖之星
日期:2016-07-21 06:20:00IT运维版块每日发帖之星
日期:2015-07-30 09:40:01技术图书徽章
日期:2014-10-14 16:00:43天蝎座
日期:2013-09-27 17:41:29CU大牛徽章
日期:2013-09-18 15:21:17CU大牛徽章
日期:2013-09-18 15:21:12CU大牛徽章
日期:2013-09-18 15:21:06CU大牛徽章
日期:2013-09-18 15:20:58每日论坛发贴之星
日期:2016-07-21 06:20:00
7 [报告]
发表于 2013-08-19 21:47 |只看该作者
1、您尝试阅读过哪些数据库的代码,您的感受是什么?
postgresql 和 mysql  最大的感受是postgresql更加严谨

2、如果您来参与开发数据库引擎,您认为难点在哪?
难点在于如何协调不同的应用对于IO和CPU的使用特点。
如高IO和多事务并发是不同的类型,通过何种方式来调整dbe的即时优化策略。
以及在现有数据结构下,来适应即时优化策略,将是DBE的一个重要发展方向和难点。

3、NoSQL等分布式数据库和现在主流的RDMS的思想上有何差别?
NoSQL是面向数据的。而RDMS则是面向事务的。所以RDMS更适用于现有的各类中小型应用。
基于关系的运算,是实体世界的表格的抽象,也是企业管理中的重要元素。
NoSQL基于KV,象图书馆这样的应用,在企业管理中少而又少。
所以注定了NoSQL只能在企业关键应用中进行助力,而无法全面取代RDBMS

论坛徽章:
0
8 [报告]
发表于 2013-08-19 22:33 |只看该作者
本帖最后由 gpingyang 于 2013-08-20 12:17 编辑

1、您尝试阅读过哪些数据库的代码,您的感受是什么?
试着阅读过一点点mysql和postgresql的源代码,最大的感受就是:
mysql的代码太过混乱,风格极不统一,C++,C风格的都有,模块结构也不是很清楚,读起来很费力,但这并不妨碍它成为最成功的开源数据库
postgresql则是纯C风格的,功能上mysql更强,但没有mysql那种为单纯强调性能的优化;模块划分很清晰,风格也很统一;虽然是C代码,但处处能体现OO的思想
也研究过tokyocabinet,不知道它是怎么火起来的,也许真的是它吹嘘的那样效率高?

2、如果您来参与开发数据库引擎,您认为难点在哪?
数据库是个很大的话题,但发展这么多多年,数据库的理论大致没啥变化
数据库(或者应该专指RDBMS系统)从结构上可以分为下面几个,每个模块的难点都不太相同
1) sql parser
parser的功能就是把sql语句字符串解析出来,用程序语言的数据结构表示出来,并对语义的检查,看输入是否是个有效的sql
这部分的理论就是编译原理中的词法和语法解析的部分,实现词法语法解析的技术已经比成熟了。
lex, yacc之类的工具可以很好的完成这项工作,借助工具即使不太熟悉编译原理的人也可以根据sql BNF语法实现parser
boost spirit库可能也是另一个选择,可以完全用C++代码优雅的完成一个parser,但我不清楚是不是真的有用这个库去实现parser的
sql parser的难点不在编译,而是在对sql 标准确的理解
2) sql reducer
reducer是对输入sql进行优化,裁减,涉及算法方面的东西就比较多了,个人认为是一个比较难的地方
比如,多个表join,怎样的顺序进行才比较高效,哪些子查询比可以去掉
难点就是评估执行的代价,并从估算和实际执行中找到一个平衡点
3) execution plan builder
这部分根据reducer输出的优化后的结构,构建出执行计划
执行计划是由多个执行元语构成的一棵树结构,执行元语如,分组,去除重复,排序等
它在数据库中起到承前启后的作用,怎么把它和上层与下层结合起来,抽象出一致的接口就显得很重要
还有,一些动作是无法做到管道化的(就是说,必须把表中的所有数据都查出来,才可以把结果吐出来,例如:排序)
怎样缓存中间生成的结果,也是一个难点,如果全部缓存在内存,结果集过大时就有撑爆内存的危险
4) storage
怎么在磁盘中存储数据,meta data,index,实际数据怎么管理
内存和外存之前的速度差几个数量级,因为这个差异,数据库都会实现一个buffer manager策略,按块读取
异步IO也是一种可以利用的技术,分离读与写,这些都可以算作是难点
事务处理,这个东西绝对是难点中的难点

3、NoSQL等分布式数据库和现在主流的RDMS的思想上有何差别?
NoSQL处理的数据结构更为简单,更强调扩展性和效率
RDMS更关注的是ACID,更适合像交易系统这样的东西
其实,我更愿意把NoSQL看作是"Not only SQL"

评分

参与人数 1可用积分 +6 收起 理由
send_linux + 6

查看全部评分

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
9 [报告]
发表于 2013-08-19 22:42 |只看该作者
话题很高深啊!!!

论坛徽章:
49
15-16赛季CBA联赛之福建
日期:2016-06-22 16:22:002015年亚洲杯之中国
日期:2015-01-23 16:25:12丑牛
日期:2015-01-20 09:39:23未羊
日期:2015-01-14 23:55:57巳蛇
日期:2015-01-06 18:21:36双鱼座
日期:2015-01-02 22:04:33午马
日期:2014-11-25 09:58:35辰龙
日期:2014-11-18 10:40:07寅虎
日期:2014-11-13 22:47:15申猴
日期:2014-10-22 15:29:50摩羯座
日期:2014-08-27 10:49:43辰龙
日期:2014-08-21 10:47:58
10 [报告]
发表于 2013-08-19 22:54 |只看该作者
ecjtubaowp 发表于 2013-08-19 22:42
话题很高深啊!!!


欢迎老五多分享啊,呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP