二、数据库基本概念
1、数据库和数据库实例
数据库(Database)
数据操作系统文件或磁盘数据块的集合
比如数据文件,索引文件,结构文件
并非所有的数据库系统都是基于文件的,也有直接把数据写入数据存储的形式
数据库实例(Database Instance)
实例指的就是操作系统中一系列的进程以及为这些进程所分配的内存块
数据库实例是访问数据库的通道
通常来说一个数据库实例对应一个数据库
多实例
利用多实例操作,可以更充分的利用硬件资源,让服务器性能最大化
分布式集群
集群就是一组组互相独立的服务器,通过高速的网络组成一个计算机系统
分布式每个数据库中都可能有数据库的一份完整副本,或者部分副本
所有服务器通过网络互相连接,共同组成一个完整的、全局的逻辑上集中、物理上分布的大型数据库
2、数据库连接和会话
数据库连接(Connection)
物理层面的通信连接,指的是一个通过网络建立的客户端和专有服务器(Dedicated Server)或调度器(Shared Server)的一个网络连接
建立连接时候指定连接参数,如数据库主机名或IP,端口号,连接用户名和口令等
数据库会话(Session)
客户端与数据库之间通信的逻辑概念
通信双方从开始通信到通信结束期间的一个上下文(Context)
这个上下文是一段位于服务器端的内存,记录了本次连接的客户端机器、对应的应用程序进程号、对应的用户登录等信息
3、数据库连接池
建立数据库连接是有代价的
频繁的建立和关闭数据库连接,会使得对连接资源的分配和释放成为数据库的瓶颈,从而降低数据库系统的性能
连接池:数据库连接的复用
负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
数据库连接可以得到高效、安全的复用
4、Schema
Schema是数据库形式语言描述的一种结构,是对象的集合
允许多个用户使用一个数据库而不干扰其他用户
把数据库对象组织成逻辑组,让他们更便于管理
形成命名空间,避免对象的名字冲突
schema又包含表及其他数据库,对象,包括数据类型、函数、操作符等
5、表空间
表空间是由一个或者多个数据文件组成
通过表空间定义数据库对象文件的存放位置
数据库中所有对象在逻辑上都存放在表空间中
在物理上存储在表空间所属的数据文件中
表空间作用
根据数据库对象使用模式安排数据物理存放位置,提高性能
频繁使用的索引放置在性能稳定且运算速度快的磁盘上
归档数据,使用频率低,对访问性能要求低的表存放在速度慢的磁盘上
通过表空间指定数据占用的物理磁盘空间
通过表空间限制物理空间使用上限,避免磁盘空间被耗尽
6、系统内置表空间
7、表
在关系数据库中,数据库表就是一系列二维数组的集合
用来代表和存储数据对象之间的关系
记录
表中的每一行称为一个记录,由若干个字段组成
字段
也称为域,表中的每一列称为一个字段
每个字段都包含两个属性:列名和数据类型
8、临时表
GaussDB 100支持创建临时表
临时表用来保存一个会话或者一个事务中需要的数据
当会话退出或者用户提交和回滚事务的时候,临时表的数据自动清空,但表结构仍然存在
临时表中的数据是临时的,过程性的,不需要和普通数据表那样永久保留的
临时表又分
会话级临时表
事务级临时表
9、表的存储方式
10、存储方式的选择
列存适合的场景
统计分析类查询(group,jion多的场景)
适合OLAP,数据挖掘等大量查询的应用查询
行存适合的场景
点查询(返回记录少,基于索引的简单查询)
适合OLTP,这种轻量级事务,大量写操作,数据增删改查比较多的场景
11、NOLOGGING表
指定NOLOGGING关键字,或者指定放在NOLOGGING表空间
NOLOGGING表不记录Redo日志
日志量减少提高数据写性能
没有Redo日志,出现故障数据库重启后无法重演恢复(Recover)
适用对象
可靠性要求不高的非核心数据
12、分区
分区表是将大表的数据分成许多小的数据子集,称为分区
范围分区表
列表分区表
哈希分区表
间隔分区表
分区表的收益
改善查询性能
增强可用性
方便维护
均衡I/O
13、分区适用场景
14、分区剪枝的原理
15、数据分布
16、数据策略选择
17、分布列选择原则
选择分布列的时候,一般遵循下面三个原则
尽量选择离散值比较多的列,保证数据均匀分布,均匀分布是为了避免木桶效应,各个DN对等执行
在满足第一条原则的情况下,不要选择存在常量过滤的列
满足前两条原则的情况下,尽量选择关联字段或聚合字段做分布列,这种方式是为了避免数据节点之间数据重分布,降低IO的开销从而提升关联操作和聚合操作的性能
18、数据类型
19、字段设计建议
尽量使用高效数据类型
尽量使用执行效率比较高的数据类型
尽量使用短字段的数据类型
使用一致的数据类型
当多个表存在逻辑关系时,表示同一含义的字段应该使用相同的数据类型
对于字符串数据,建议使用变长字符串数据类型,并指定最大长度
20、视图
视图与基本表不同,不是物理上实际存在的,是一个虚表
21、视图的作用
视图作用
简化了操作,把经常使用的数据定义为视图
安全性,用户只能查询和修改能看到的数据
逻辑上的独立性,屏蔽了真实表的结构带来的影响
限制性
性能问题:查询可能很简单,但是封装的视图语句很复杂
修改限制:对于复杂视图,用户不能通过视图修改基表数据
22、索引
索引提供指向存储在表的指定列中的数据值的指针,如同图书的目录,能够加快表的查询速度,但同时也增加了插入、更新和删除操作的处理时间
在创建索引时,以下建议作为参考
在经常需要搜索查询的列上创建索引,可以加快搜索的速度
在作为主键的列上创建索引,强制该列的唯一性和组织表中数据的排列结构
在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的
在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间
在经常使用where子句的列上创建索引,加快条件的判断速度
为经常出现在关键字order by、group by、distinct后面的字段创建索引
23、有效索引
创建索引≠索引一定被使用
索引创建成功后,系统会自动判断何时引用索引,当系统认为使用索引比顺序扫描更快时,就会使用索引
索引创建成功后,必须和表保持同步以保证能够准确地找到新数据,这样就增加了数据操作的负荷
需要定期删除无用的索引
判断方法
通过执行explain语句查看执行计划来判断是否使用索引
24、索引方式
25、约束
数据的完整性是指数据的准确性和一致性,可以通过定义表时定义完整性约束
完整性约束是一种规则,本身不占用数据库空间
完整性约束和表结构定义一起保存在数据字典中
常见的约束类型
唯一性和主键约束(UNIQUE/PRIMARY KEY)
外键约束(FOREIGN KEY)
检查约束(CHECK)
非空约束(NOT NULL)
默认约束(DEFAULT)
26、约束的设计
如果能够从业务层面补全字段值,就不建议使用DEFAULT约束,避免数据加载时产生不符合预期的结果
给明确不存在NULL值的字段加上NOT NULL约束,优化器会在对其进行自动优化
给可以显式命名的约束显式命名,除了NOT NULL和DEFAULT约束外,其他约束都可以显式命名
27、数据库对象
什么是数据库对象
数据库对象是数据库的组成部分,数据库对象主要包含:表,索引,视图,存储过程,缺省值,规则,触发器,用户,函数等
表
表是数据库中的一种特殊数据结构,用于存储数据对象以及对象之间的关系,由行和列组成的
索引
索引是对数据库表中一列服务器托管网或多列的值进行排序的一个结构,使用索引可快速访问数据库表中的特定信息
视图
视图是从一个或几个基本表汇总导出的虚表,可用于控制用户对数据访问
存储过程
存储过程是一组为了完成特定功能的SQL语句的集合,一般用于报表统计,数据迁移等
缺省值
缺省值是当在表中创建列或插入数据时,对没有指定其具体值的列或列数据项赋予事先设定好的值
规则
规则是对数据库表中数据信息的限制,它限定的是表的列
触发器
触发器是一种特殊类型的存储过程,通过指定的事件触发执行,一般用户数据审计、数据备份等
函数
函数是对一些业务逻辑的封装,以完成特定的功能,函数执行完成后会返回执行结果
28、数据库对象间关系
29、事务
事务(Transaction)
事务是用户定义的数据操作系列,这些操作作为一个完整的工作单元执行
一个事务内的所有语句作为一个整体,要么全部执行,要么全部不执行
比如A账户给B账户转账1000元
第一个操作:A账户-1000
第二个操作:B账户+1000
转账的两个操作必须通过事务来保证全部操作成功,或者全部失败
事务结束的标记有两个
正常结束,COMMIT(提交事务)
异常结束,ROLLBACK(回滚事务)
30、事务处理模型
事务处理模型分为两类
显式事务:事务有显式的开始和结束标记
隐式事务:每一条数据操作语句都自动的成为一个事务
31、事务特征-ACID
事务特征-ACID
原子性(Atomicity)
事务是数据库的逻辑工作单位,事务中的操作,要么全做,要么全不做
一致性(Consistency)
事务的执行结果必须是使数据库从一个一致性状态转到另一个一致性状态
隔离性(Isolation)
数据库中一个事务的执行不能被其他事务干扰,即一个事务的内部操作及使用的数据对其他事务是隔离的,并发执行的各个事务不能相互干扰
持久性(Durability)
事务一旦提交,对数据库中数据的改变是永久的,提交后的操作或者故障不会对事务的操作结果产生任何影响
32、数据不一致情况-脏读
"Dirty" Reads(脏读)
一个事务读取到了其他事务中还没有提交(Committed)的数据
因为未提交数据存在回滚的可能,所以被称为"脏数据"
33、数据不一致情况-不可重复读
Non-repeatable Reads(不可重复读)
一个事务所获取到的数据是可以被其它事务修改的
一个事务在处理过程中多次读取同一个数据(重复读),这个数据是可能发生变化的,因此被称为不可重复读
Phantom Reads(幻影读)
是不可重复读的更为特殊的一个场景
事务T1按照一定条件读取数据(使用了WHERE条件过滤)后,事务T2删除了部分记录服务器托管网或者插入了一些新的记录,这些变更的数据是满足where条件过滤的
那么当T1再次按照相同条件读取数据时,就会发现莫名其妙的少了(也可能多了)一些数据
这些变化的数据就被称为"幻影"数据
34、事务隔离级别
ANSI SQL标准定义了4种事务隔离级别来避免3种数据不一致的问题,事务级别从高到低,分别为
Serializable(序列化)
系统中所有的事务以串行的方式逐个执行,所以能避免所有数据不一致的情况
但是这种以排他方式来控制并发事务,串行化执行方式会导致事务排队,系统的并发量大幅下降,使用的时候要绝对慎重
Repeatable read(可重复读)
一个事务一旦开始,事务过程中所读取的所有数据不允许被其他事务修改
这个隔离级别没有办法解决"幻影读"的问题
因为它只保护了它读取的数据不被修改,但是其他数据会被修改,如果其他数据被修改后恰好满足了当前事务的过滤条件(where子句),那么就会发生"幻影读"的情况
Read Committed(已提交读)
一个事务能读取到其他事务提交过(Committed)的数据
一个事务在处理过程中如果重复读某一个数据,而且这个数据恰好被其他事务修改并提交了,那么当前重复读取数据的事务就会出现同一个数据前后不同的情况
在这个隔离级别会发生"不可重复读"的场景
Read Uncommitted(未提交读)
一个事务能读取到其他事务修改过,但是还没有提交的(Uncommitted)的数据
数据被其他事务修改过,但还没有提交,就存在着回滚的可能性,这时候读取这些"未提交"数据的情况就是"脏读"
在这个隔离级别会发生"脏读"场景
35、事务隔离级别与问题对应表
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
相关推荐: OpenResty入门之压测篇:压测工具界的 “悍马” wrk 审核中
在上篇文章 每个后端都应该了解的 OpenResty 入门以及网关安全实战 中,我向大家介绍了 OpenResty 的入门使用是 WAF 防御实战,这篇文章将给大家继续介绍 OpenResty 入门之性能测试 篇。 性能测试是软件开发中不可或缺的一环,它可以帮…