重点
如何设计一个关系型数据库
- 数据库最主要的功能是储存我们的数据,因此需要一个存储模块来存储数据、类似OS文件系统,将数据持久化存入磁盘中
- 光有存储还不够、需要组织运用数据。因而需要程序实例
- 存储管理模块:对数据的格式以及文件的分割进行统一管理,即把物理数据通过逻辑的形式表现出来。
如何优化存储性能
磁盘的IO速率是程序执行速度的瓶颈,为了执行速率,需要尽可能的减少IO,一次IO读取单行数据和多行数据的时间并没有多少区别,一次性读取多行数据以提升IO的效能,所以就失去了它的意义,数据库把逻辑存储单位以块和页来表示,每个块标识会存放多行数据,这样读取的时候会把多个块一起加载的内存中
- 缓存机制:将取出来的数据填入缓存,下次直接从缓存返回而不用IO。
一次性查找多个块和页,这些里边包含的数据有一部分不是我们这次查询的数据,一旦某行数据被访问到,那么它附件的数据也极有可能会被访问。所以缓存的非本次数据也能起到优化效率的作用。
缓存不宜过大且算法里要有淘汰机制、淘汰之后不常用的数据
- SQL解析:将sql语句编译解析成机器可读的语言
可通过将SQL语句缓存到缓存中去,编译好的sql方便下次直接使用的时候直接解析。
- 日志管理: 将SQL的参数记录下来、方便做数据库的主从同步或者灾难恢复。
- 权限划分:用户管理数据的私密空间
- 容灾机制:数据库出现异常该如何恢复,恢复到何种程度
- 索引管理
- 锁管理
索引模块
- 索引
索引相当于一张表的附加表,存储着表中建立索引的字段值以及对应记录值的地址,在进行查询操作时,首先在索引表中进行查询,根据查询的条件找到相关记录的地址,再根据记录地址在表中存取对应的记录。
经常进行INSERT、UPDATE、DELETE操作就不要建立索引了,换言之,索引会降低插入、删除、更新等维护任务的速度。
索引分为聚集索引和非聚集索引。
目前MySQL的InnoDB引擎支持Hash索引、B+树索引和全文索引。 - 为什么要使用索引
- 索引大大减少了存储引擎需要扫描的数据量
- 索引可以帮助我们进行排序以避免以避免使用临时表
- 索引可以将随机的I/O转为顺序的I/O
- 什么信息能成为索引
- 能把该记录限定到一定范围内的字段
主键、唯一键和其他普通键等。
- 索引的数据结构
- 生成索引、建立二叉查找树进行查找。
- 生成索引、通过B-Tree结构进行查找
- 生成索引,建立B±Tree结构进行查找
- 生成索引,建立Hash结构进行查找