关系型数据库和非关系型数据库的区别
简单来说:
1.关系型数据库通过 外键关联 来建立表与表之间的关系
2.非关系型数据库通常指 数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定
比如 有一个学生的数据:
姓名:张三,性别:男,学号:12345,班级:二年级一班
还有一个班级的数据:
班级:二年级一班,班主任:李四
关系型数据库中,我们创建学生表和班级表来存这两条数据,并且学生表中的班级存储的是班级表中的主键。
非关系型数据库中,我们创建两个对象,一个是学生对象,一个是班级对象
如何设计一个关系型数据库
一个合格的RDBMS(Relational Database Management System, 关系型数据库管理系统
)应该包含下面几个内容:
-
要有一个存储模块负责存储我们的数据(
类似于文件系统,将数据持久化地存入到磁盘中
). -
除了有存储模块一块,我们还需要组织和使用这些数据,需要一个程序实例,用逻辑结构映射出物理结构,并且在程序中提供获取以及管理数据的方式以及必要的问题追踪机制. 这主要包括:
- 存储管理模块:我们需要对数据的格式以及文件的分隔进行统一的管理, 即把物理数据通过逻辑的形式给组织和表示出来
- 缓存机制:把取出来的数据块(因为一行一行从磁盘读太慢了,多读一点放内存里,这样可以提高数据库效率) 存放在缓存里,下次需要的时候,直接从内存里返回,而不用发生io行为.
- SQL解析模块:将SQL编译解析转换为机器可执行的指令.
- 日志管理模块:对我们的操作做记录,方便我们做数据库的
灾难恢复
等. - 权限划分模块:给用户提供一定的私密空间,根据不同的权限,只能看到不同的数据.
- 异常容灾机制模块:但我们数据库出现异常,应该怎么恢复这些问题.
- 索引模块:优化数据查询效率.
- 锁模块:使得数据库支持并发操作.
总结如下
为什么要使用索引
索引是对某个字段进行排序的一种方式。对数据库表中一个或多个列(例如,employee 表的姓氏 (lname) 列)的值进行排序的结构。简单粗暴的说,你可以认为索引就是一棵B+Tree
如果我们使用全表扫描
的方式,将整张表的数据都一起加载到内存中,然后一块一块(数据库的存储及加载单位是数据块或者数据页
)得扫描数据,当数据量小的时候很快,但是当数据量非常大的时候,会极其缓慢,内存压力也贼大.
索引就是为了解决全表扫描在数据量很大的情况下效率很低而产生的,其 灵感来自于字典,可以根据偏旁部首这些去很快地查到我们想要的字词所在的页面进而查找到我们想要的字词,而 这些关键信息以及根据关键字查找数据的方式便组成了我们的索引
所以,使用索引的原因: 通过索引,可以较少全表扫描的次数,大幅度地提升查询数据的速度.
什么样的信息可以成为索引
肯定是那种可以把数据限定在某一范围的字段啦哈哈哈哈
主键 当然首当其冲,肯定可以,唯一键以及普通键也可以,能起到那种作用都可以.
索引的数据结构
- 最简单的: 生成索引,建立
二叉搜索树(左边都比根节点小,右边都比根节点大,且没有重复的节点,查找的时间复杂度可以O(logN))
进行二分查找. - 复杂点的: 生成索引,通过它的变种–>
平衡二叉树(AVL树)
–>红黑树(自平衡的二叉搜索树)
–>B-Tree(平衡多路查找树)
结构进行查找. - 再牛逼一点的: 生成索引,建立
B+Tree(B树的变形)结构
进行查找,mysql索引是通过B+Tree实现的. - 还有一种,生成索引,建立
Hash结构
进行查找.
关于每种结构的优缺点,我们下一篇博客再说