数据库简介
简单介绍一下数据库的基本原理。
真实数据存储
在数据库中,为了管理数据,数据必须分成记录,每条记录都包含几个字段(对应于数据库表中列的概念)。这些数据物理上可以按记录存储(行式数据库),或者按照整列字段存储(列式数据库)。为了标识每一条记录的不同,我们规定了主键的概念,主键对于每条记录都是不同的,举个例子,存储居民信息,居民身份证号就可以作为主键。常见的数据库如MysQL,Oracle等都是将数据存储在磁盘上,因此要设计基于磁盘的存储引擎。现在随着SSD价格的下降和性能要求,SSD也开始流行起来,OceanBase就支持SSD的存储。现在,基于内存的存储项目也越来越多,比较有名的项目是RAMCloud。
数据库索引
存好了数据我们便有了查询数据的要求,但是如果一条一条记录读取然后进行查找的话效率特别的低下,所以需要索引,根据索引可以很快的查找到数据,数据库中经常用到的索引结构就是B树,使用B树可以减少读取磁盘的次数(传统的数据库的B树结构都是保存到磁盘上的,当然也可以使用其它数据结构,这里以B树举例),具体B树的原理请参考链接。
数据库以B树格式储存主键索引,只解决了按照主键查找数据的问题。如果想查找其他字段,就需要建立其它字段的索引。所谓索引,就是一种可以进行快速查询数据的数据结构。比如居民数据表中根据性别查询数据,我们便需要建立性别字段的索引,里面保存性别字段和对应记录的位置,这样便可以很快的进行查询了。
所以是为了加快select效率而设计的,索引的使用有很多的技巧,关注数据库查询性能的话要好好理解索引的使用。
其它功能
有了上面的内容以后,我们就有了数据库的存储引擎了,对,就是数据的保存和索引工具。但这些是最基本的工具,要实现一个数据库我们还要完成以下工作:SQL语句的解析和执行,数据库事务控制,容错机制。
协议支持
数据库客户端和服务器之间的通信协议,最常用的是MySQL协议。包括认证和数据交互。
SQL解析和执行
SQL语句的解析和执行包括两个方面,首先,对于输入的SQL语句进行解析(编译原理那一套,词法解析,语法解析,etc)生成逻辑执行计划(逻辑上的SQL语句执行过程),根据逻辑执行计划生成具体的物理执行计划(具体的操作计划,比如遍历磁盘上某一列数据)。这需要很高的算法基础和编译原理基础。
数据库事务
事务是一系列数据库操作的集合,事物要满足ACID原则。这就需要对事务的并发控制和事务执行失败的错误处理,需要用到很多技术比如说死锁检测,并发控制,日志记录和恢复管理等。在分布式系统中,使用事务的代价很高,主要原因是性能问题,很多数据库中间件都不支持多机事务。OceanBase早期版本将事务转换成了单机事务,由UpdateServer处理,主要思路就是读写分离。
容错机制
容错就是保证硬件出现故障能够保证数据还正确存在,即能从故障、多种类型的错误或者故意滥用中进行恢复。很多时候用到的是冗余技术(一份数据存多份)。容错往往通过日志完成,同时要注意日志复制的方法。
总结
要真正实现数据库还是非常困难的,要考虑性能,各种故障灯因素,本文主要是大体的理解数据库基本原理。