数据库补充知识
目录
1、简介
2、为什么要用数据库
3、数据库的分类
1、简介
数据库简称 DB,是按照数据结构来组织、存储和管理数据的仓库,用户可以对文件的数据进行增加、删除、修改、查找等操作。 区分一下,数据库管理系统简称DBMS,是一种操纵和管理数据库的大型软件,是用于建立、使用和维护数据库(DB)。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。
2、为什么要用数据库
-
数据库可以存储大量的数据信息,方便用户进行有效的访问。数据库还可以对数据进行分类保存,并且能够提供快速的查询。
-
数据库可以满足应用的共享和安全方面的要求,把数据放在数据库中在很多情况下也是出于安全的考虑。
-
数据库技术能够方便智能化地分析,产生新的有用信息。
3、数据库的分类
关系型数据库 采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,以便于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。下面是常见的一些关系型数据库: MySQL: 免费的数据库系统。被广泛用于中小型应用系统。体积小、速度快、总体拥有成本低,开放源代码。
SQL Server : 是由微软公司开发的一种关系型数据库管理系统(RDBMS),用于存储和检索数据。它提供了一个可扩展的、安全的和可靠的数据存储和管理解决方案。
Oracle: 是目前比较成功的关系型数据库管理系统。运行稳定、功能齐全、性能超群、技术领先。主要应用在大型的企业数据库领域。
4.原理
数据库的每张表都是以文件的形式存储到硬盘上的,数据只要是在硬盘上一定以文件形式存储,当表的数据特别大时文件也会特别大,所以一个文件会达到几百M,G等等大小
数据库是在内存中运行的(所有程序都在内存运行),mysql是以进程的形式占据内存的某个区域;当想从表中查询某个数据,需要把整个表经过总线加载到内存进行查询,数据太多的时候总线承压就很大;这时候就会建立索引(相当于对数据进行排序),这样可以加快查询速度
文件进入内存的时候,是以数组的形式进入的(即流、不管是文件流还是其他如比特流,都是数组),数据库的每行数据都是固定长度,占据一个固定的数据单元,当创建索引的时候,查询的时候只会加载索引文件这一列(比原数组小得多)并附有源文件的地址,查询的时候就可以根据索引从树中查询到目标地址进而找到原文件,时间复杂度降到log,增大读取速度
读取数据的时候不再加载原表,而是加载索引文件,根据找到的索引文件知道目标地址,然后直接向硬盘下达地址指令,不需要再将文件加载到内存中了,直接读取找到目标文件,降低总线压力、减小内存,增快速度,性能变好
所以高并发系统不允许一个表存储数据太多(一般数据达到几百万的时候就需要把表拆掉了),这样的话索引文件也会很大!!!
最大的问题是所有数据存在一起,好处是求整体/关联计算的时候方便(最大/最小/平均等),所以myysql叫关系型数据库,擅长整体计算;但是处理单条数据的时候很麻烦,这时候就出现了非关系型数据库,如hive\hbase\zk\es ,数据分开存放,不再形成一个大文件,划分的文件小,定点操作,支持高并发
5、内存数据库 -redis
redis整个数据都在内存中,通过哈希表的散列把数据弄成一份一份的,Redis内部用一种叫哈希表的数据结构来存储数据。哈希表就像一个有很多小格子的柜子,每个格子都有一个编号(哈希值)。当你存数据时,Redis会根据数据的键(key)计算出一个哈希值,然后把数据放到对应的格子里。当你找数据时,它会直接根据键找到对应的格子,很快就能拿到数据。
redis速度很快,由于内存的空间小,所以只能存一部分访问频率很高的数据到redis中,所有活跃数据常驻内存,实现纳秒级访问;缺点是可能会丢数据,Redis 服务器突然断电或出现硬件故障,内存中的数据会丢失,使用定时备份也会丢失一部分数据,因为如果数据备份间隔期间发生故障,可能会丢失这段时间内的数;解决方案是用一个消息队列配合redis使用,丢失的数据可以通过消息队列还原
6、数据库访问流程
进程之间通过端口通信,端口是用来识别不同程序的标志,网卡会把数据存储起来按照端口进行分类;每个程序会定时来其端口查取数据,所有的程序它的底层只要涉及到网络发送和接收的一定是socket
-
Socket通信:
-
进程间通过端口进行通信,端口是识别不同程序的标志
-
网卡接收数据后按照端口分类存储
-
程序定时检查自己的端口获取数据
-
所有涉及网络通信的程序底层都使用socket
-
-
数据库访问流程:
-
应用程序(Java/Python/Go/C#等)通过socket发送SQL语句到数据库端口(MySQL默认3306)
-
MySQL服务监听指定端口,接收SQL请求
-
数据库引擎解析SQL语句字符串
-
执行查询/更新操作
-
将结果通过同一socket连接经过同一个端口返回给应用程序返回给应用程序
-