数据库存储系统
19 March 2015
这是原来在百度内网上看到的一个视频《数据库存储系统》整理的笔记:
想做一个数据存储系统,按照数据量大小按三个阶段:
- 数据量小:所有数据全放在内存,利用map的key-value结构,也可以是hash表或者红黑树等结构。
- 数据量较大:数据存入磁盘文件,索引放入内存。索引中存的是id+offset。 磁盘的寻道经过电梯算法的优化也依然有10ms,效率低下。
- 数据量很大:索引都无法全放入内存。将主键索引建立B+树,有序组织索引,leaf page放入磁盘,no-leaf page可以使用缓存。
在数据组织上,有些基本的想法:
- 用顺序IO(还不错有50M/s)代替随机IO(很差)
- 数据的组织并不用全局有序,这样会很容易造成page分裂。而使用的策略是:page间有序,page内有冗余且无序。
数据读写的过程:
- 在B+树中找到所查找id所在的page
- 在page中找到这个id对应的数据
- 将数据读出来之后原地修改并写入
对数据库的理解:
数据库是数据存储的一种方式,它的最大特点是保证了ACID,比如保证了并发环境下的事务隔离级别等问题。另外SQL只是数据库的一种API。 数据库最重要的特性是:锁和日志。它们都是用来实现ACID的。
对比KV存储与数据库:
KV比较关注高性能(比如memcached),但是功能上数据库更丰富。
数据库查询性能影响因素:
- 索引
- 数据分布 数据库的优化器会考虑以上两点来执行。
数据库的日志:
逻辑数据体现在日志,可能此时物理数据还在buffer中还未写入磁盘。 checkpoint,将数据和日志一致。
-EOF-