二、数据库重要概念
文章目录
1、数据库和数据库实例
- 数据库(Database)
- 物理操系统文件或磁盘数据块的集合
- 比如数据文件,索引文件,结构文件
- 并非所有的数据库系统都是基于文件的,也有直接把数据写入数据存储的形式
- 物理操系统文件或磁盘数据块的集合
- 数据库实例(Database Instance)
- 实例指的就是操作系统中一系列的进程以及为这些进程所分配的内存块
- 数据库实例是访问数据库的通道
- 通常来说一个数据库实例对应一个数据库
-
多实例
- 利用多实例操作,可以更充分的利用硬件资源,让服务器性能最大化
-
分布式集群
- 集群就是一组相互独立的服务器,通过高速的网络组成一个计算机系统
- 分布式集群中,每个服务器都可能有数据库的一份完整副本,或者部分副本,所有服务器通过网络相互连接,共同组成一个完整的,全局的,逻辑上集中,物理上分布的大型数据库
- 数据库连接(connection)
- 物理层面的通信连接,指的是一个通过网络建立的客户端和专有服务器(Dedicated Server)或调度器(Shared Server)的一个网络连接
- 建立连接时指定连接参数,如服务器主机或IP,端口号,连接用户名和口令等
- 数据库会话(Session)
- 客户端和数据库之间通信的逻辑概念
- 通信双方从开始通信到通信结束期间的一个上下文(Context)。这个上下文是一段位于服务器端的内存:记录了本次连接的客户端机器,对应的应用程序进程号、对应的用户登录等信息
2、数据库连接池
- 建立数据库连接是有代价的
- 频繁的建立和关闭数据库连接,会使得对连接资源的分配和释放成为数据库的瓶颈,从而降低数据库的性能
- 连接池:数据库连接的复用
- 负责分配、管理和释放数据连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
- 数据库连接可以得到高效、安全的复用
3、Schema
- Schema是数据库形式语言描述的一种结构,是对象的集合
- 允许多个用户使用一个数据库而不干扰其他用户
- 把数据库对象组织成逻辑组,让他们更便于管理
- 形成命名空间,避免对象的名字冲突
- schema包含表及其他数据库对象,数据类型,函数,操作符等
4、表空间(Table space)
- 表空间是由一个或多个数据文件组成的
- 通过表空间定义数据库对象文件的存放位置
- 数据库中所有的对象在逻辑上都存在表空间中
- 在物理上存储在表空间所属的数据文件中
- 表空间的作用
- 根据数据库对象使用模式安排数据物理存放位置,提高性能
- 频繁使用的索引放置在性能稳定且运算速度较快的磁盘上
- 归档数据,使用频率低,对访问性能要求低的表存放在速度慢的磁盘上
- 通过表空间指定数据占用的物理磁盘空间
- 通过表空间限制物理空间使用上限,避免磁盘空间被耗尽。
- 通过表空间限制物理空间使用上限,避免磁盘空间被耗尽。
- 根据数据库对象使用模式安排数据物理存放位置,提高性能
5、表(Table)
- 在关系数据库中,数据库表就是一系列二维数组的集合
- 用来代表和存储数据对象之间的关系
- 记录
- 表中的每一行称为一个记录,由若干个字段组成
- 字段
- 也称域,表中的每一列称为一个字段
- 每个字段都包含两个属性:列名和数据类型
6、临时表
- GaussDB(for MySQL)支持创建临时表
- 临时表用来保存一个会话中需要的数据。当会话退出的时候,临时表的数据自动清空
- 临时表中的数据是临时的,过程性的,不需要和普通的数据那样永久保存
- 使用SHOW TABLES命令无法显示临时表
7、表的存储方式
8、存储方式的选择
- 列式存储适合的场景
- 统计分析查询类
- 适合OLAP,数据挖掘等大量查询的应用查询
- 行存适合的场景
- 点查询(返回记录少,基于索引的简单查询)
- 适合OLTP,这种轻量级事务,大量写操作,数据增删改比较多的场景
9、分区(Partition)
- 分区表是将大表的数据分成许多小的数据子集,称为分区
- 范围分区表
- 列表分区表
- 哈希分区表
- 间隔分区表
- 分区表的收益
- 改善查询性能
- 增强可用性
- 方便维护
- 均衡I/O
10、数据分布
- GaussDB(DWS)分布式数据库的数据表是分散在所有数据节点(DataNode,DN)上的,所以创建表的时候需要指定分布列
分布方式 | 说明 |
---|---|
Hash | 表数据通过Hash方式散列到集群中的所有DN |
Replication | 集群中每一个DN都有一份全量表数据 |
List | 表数据通过List方式分布到指定DN节点上 |
Range | 表数据通过Range方式分布到指定DN节点上 |
11、分布列选择原则
- 选择分布列的时候,一般遵循下面三个原则:
- 尽量选择离散值比较多的列,保证数据均匀分布
- 不要选择常过滤的列
- 选择关联字段和聚合字段,避免数据节点间数据重分布,降低IO的开销,从而提升关联操作和聚合操作的性能
12、数据类型
- 基本数据类型
- 数值类型
- 字符类型
- 二进制类型
- 日期/时间类型
- 布尔类型
- 枚举类型等
- 序列号类型
- 几何类型
13、字段设计建议
- 尽量使用执行效率比较高效的数据类型
- 尽量使用短字节的数据类型
14、视图(View)
- 视图与基本表不同,不是物理上实际存在的,是一个虚表
15、视图的作用
- 视图的作用
- 简化操作,把经常使用的数据定义为视图
- 安全性,用户只能查询和修改能看到的数据
- 逻辑上的独立性,屏蔽了真实表的结构带来的影响
- 通过视图封装较为复杂的逻辑,用户使用的时候和普通表一样,简化SQL查询语句
- 限制性
- 性能问题:查询可能很简单,但是封装的视图语句很复杂
- 修改限制:对于复杂视图,用户不能通过视图修改基表数据
16、索引(index)
- 索引提供指向存储在表的指定列中的数据值的指针,加快了查询速度,但同时也增加了插入,更新和删除操作的时间
- 创建索引不等于索引一定被使用
- 系统自动判断何时引用索引,当系统认为使用索引比顺序扫描更快时,就会使用索引
- 索引创建成功后,必须和表保持同步,以保证能够准确的找到新数据,增加了数据操作的负荷
- 需要定期删除无用的索引
- 判断方法
- 通过执行explain语句查看执行计划来判断是否使用索引
17、索引方式
索引方式 | 描述 |
---|---|
普通索引 | 基本索引类型,没有限制,允许在定义索引的列中插入重复值和空值,只是为了加快查询速度 |
唯一索引 | 索引列中的值必须是唯一的,允许为空置 |
主键索引 | 是一种特殊的唯一索引,不允许有空值 |
组合索引 | 表中多个字段组合上创建的索引,在查询条件中使用了这些字段的左边字段时,索引才会被使用 |
全文索引 | 主要用来查找文本中的关键字,而不是直接与索引中的值相比较 |
18、约束
- 数据的完整性是指数据的正确性和一致性,可以通过定义表定义完整性的约束
- 完整性约束是一种规则,本身不占用数据库空间
- 完整性约束和表结构定义一起保存在数据字典中
- 常见的约束类型
- 唯一性和主键约束
- 外键约束
- 检查约束
- 非空约束
- 默认约束
19、数据库对象间关系
20、事务(Transaction)
- 事务是用户定义的数据操作系列,这些操作作为一个完整的工作单元执行
- 原子性(Atomicity):事务是数据库的逻辑工作单位,事务中的操作,要么都做,要么都不做
- 一致性(Consistency):事务的执行结果必须是使数据库从一个一致性状态到另一个一致性状态
- 隔离性(Isolation):数据库中的一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对其他事务是隔离的,并发执行的各个事务不能相互干扰
- 持久性(Durability):事务一旦提交,对数据库中数据的改变是永久的。提交后的操作或者故障不会对事务的操作结果产生任何影响
- 事务结束的两个标记
- 正常结束,COMMIT(提交事务)
- 异常结束,ROLLBACK(回滚事务)
- 事务处理模型
- 隐式事务:每一条数据操作语句都自动地成为一个事务。GaussDB(for MySQL)默认是隐式提交
- 显示事务:事务有显示的开始和结束标记
21、数据不一致情况 - 脏读和不可重复读
- 脏读
- 一个事务读取到了其他事务中还没有提交的数据
- 因为未提交的数据存在回滚的可能,所以被称为“脏”数据
- 不可重复读
- 一个事务所获取到的数据是可以被其他事务修改的
- 一个事务在处理过程中多次读取同一个数据,这个数据是可能变化的,因此称为不可重复读
- 幻影读
- 是不可重复读的更为特殊的一个场景
- 一个事务在另一个事务按照条件读取数据后,按照条件删除或者插入了一些新的记录,另一个事务再次读取数据时,就会莫名其妙的少了或者多了一些数据
- 这些变化的数据称为“幻影”数据
22、事务隔离级别与问题
事务隔离级别 | 脏读 | 不可重复读 | 幻影读 |
---|---|---|---|
未提交读 | 可能 | 可能 | 可能 |
已提交读 | 不可能 | 可能 | 可能 |
可重复读 | 不可能 | 不可能 | 可能 |
序列化 | 不可能 | 不可能 | 不可能 |