文章目录
- 常见数据库有哪些?
- SQL和NOSQL区别和优缺点
- 数据库系统可以从那些方面进行优化?
- 1.应用层的优化
- 2.数据库设计与配置优化
- 3.数据库配置优化
- 4.操作系统和硬件优化
- 5.架构优化
- IOE概念
- Oracle体系结构
- 物理结构
- 内存结构
- 后台服务进程
- Oracle扩展 RAC
- 双机热备
- 表空间
- 表空间类型
- 表空间的管理
- 表空间的操作
- 两种日志文件
- 在线重做日志
- 归档重做日志
- 管理Oracle实例
- 启动数据库
- 关闭数据库的四种模式
- 备份
- 监听程序的管理
- PL/SQL
- 优点
- 变量可见性
- 判断if/else
- 循环LOOP...EXIT...END
- 循环LOOP...EXIT WHEN...END
- 循环while...LOOP...END LOOP
- 循环for...IN...LOOP...END LOOP
- 储存过程
- 触发器
- 游标
- 索引(Index)
- OceanBase
常见数据库有哪些?
关系型数据库:Oracle、MySQL、Microsoft SQL Server
非关系型数据库:Redis、MongoDB
开源数据库:MongoDB、Redis、MariaDB
SQL和NOSQL区别和优缺点
SQL(关系型数据库)基于表,数据结构必须事先定义好;而NoSQL(非关系型或分布式数据库)基于键值对,数据是动态无结构的。
- SQL优点:结构化数据,能进行复杂查询、有事务处理,可保持数据一致性、精确、有历史数据
- SQL缺点:数据需要转换为基础类型、扩展较为困难、大量数据的写入处理较慢
- NOSQL优点:快速、便宜、可扩展、适于保存大量和分层数据
- NOSQL缺点:缺乏事务处理、不擅长复杂查询、不遵循ACID
数据库系统可以从那些方面进行优化?
1.应用层的优化
应用响应速度的瓶颈:查询缓慢、CPU饱和、网络延迟、文件I/O
使用连接池和缓存。
2.数据库设计与配置优化
优化设计不良或索引不佳的表结构,能把性能提升几个数量级
3.数据库配置优化
包括缓存大小、I/O调优、并发数等,能获得两到三倍的性能提升。
4.操作系统和硬件优化
CPU、内存、I/O、网络、操作系统
5.架构优化
构建大型、高性能应用程序,可分为分散式数据库架构、集中式数据库架构、分布式数据库架构
IOE概念
IBM是服务器提供商,Oracle是数据库软件提供商,EMC则是存储设备提供商,三者构成了一个从软件到硬件的企业数据库系统。
Oracle体系结构
详见此处
物理结构
分为控制文件、数据文件、重做日志文件
- 控制文件
记录数据库的物理结构 - 数据文件
储存所有数据库数据。逻辑结构中的一个表空间对应一个或多个数据文件。 - 重做日志文件
记录数据所发生的修改。
内存结构
系统全局区和程序全局区
- 系统全局区(SGA)
系统所有进程共享的内存区域。 - 程序全局区(PGA)
为了某个进程所服务的。这个内存区不是共享的,只有用户的服务进程以及后台进程本身才能够访问它自己的PGA区。
后台服务进程
- 数据库复写器(DBWn)
管理缓冲储存区,将缓冲区的脏数据写入磁盘 - 日志复写器(LGWR)
管理日志缓冲区,将上次写磁盘后的所有日志缓冲写入日志文件 - 系统监控进程(SMON)
执行实例恢复 - 进程监控器(PMON)
在用户进程出现故障后执行进程恢复 - 检查点(CKPT)
修改控制文件信息 - 归档进程(ARCn)
自动归档联机重做日志文件
Oracle扩展 RAC
Oracle扩展用得最多的方式是RAC(实时应用集群)
两(多)台服务器上各自运行一个数据库进程,共同管理、操作一个数据库,客服端无论连接哪个都可以操作数据库。当某一个服务器故障时,其他服务器还可以正常工作。由于不需要临时启动新的服务进程,因此没有切换时间。
优点:
- 良好的可伸缩性
- 高可用性
- 缓存融合技术
- 降低硬件成本
- 切换时间短
缺点: - 管理复杂
- 对网络有较高要求
双机热备
在双机热备份方式下,需要共享存储,数据库系统平时只能在一台服务器 ( 例如服务器 A) 上运行,另一台服务器无法直接访问数据库,自然也无法进行负载分担。当服务器 A 由于故障失效时,由相应的操作系统软件控制,将服务器 A 管理的存储设备 ( 如硬盘 ) 转交给服务器 B 控制,同时在服务器 B 上启动另一个数据库进程,管理数据库。这种切换并启动新的数据库核心的过程一般需要几十秒到几分钟。
表空间
Oracle的表空间属于Oracle中的存储结构,是一种用于存储数据库对象(如:数据文件)的逻辑空间,是Oracle中信息存储的最大逻辑单元,其下还包含有段、区、数据块等逻辑数据类型。表空间是在数据库中开辟的一个空间,用于存放数据库的对象,一个数据库可以由多个表空间组成。
相较于mysql有多个数据库,oracle只有一个数据库,其下有多个表空间。
oracle安装完数据库的一般流程:先建表空间(分区)–>再建用户(分配相应的表空间和用户权限)–>登陆用户,建表
表空间类型
分为系统表空间和非系统表空间
- 系统表空间随着数据库创建被创建,包含数据字典信息和系统回滚段
- 非系统表空间包括回滚段、临时段(用于排序操作),控制着分配给用户的空间容量。
表空间的管理
- 本地管理的表空间
自由扩展信息被记录在本身的位图中,位图中的每一位都对应一个或一组数据块,显示数据块是否被使用。 - 字典管理的表空间(缺省)
自由扩展信息被记录在全局数据字典中
表空间的操作
创建本地管理的表空间
CREATE TABLESPACE userdataDATAFILE '/userfile.dbf' SIZE 500M --储存地址、初始大小EXTENT MANAGEMENT LOCAL UNIFORM SIZE 256K;
创建字典管理的表空间
CREATE TABLESPACE userdata123DATAFILE '/userfile.dbf' SIZE 500MEXTENT MANAGEMENT DICTIONARYDEFAULT STORAGE (initial 1M NEXT 1M);
两种日志文件
重做日志文件分为在线重做日志和归档重做日志
在线重做日志
又称联机重做日志,指Orcale以SQL脚本的形式实时记录数据库中的数据更新。
归档重做日志
指当条件满足时,Oracle将在线重做日志以文件的形式保存在硬盘。
管理Oracle实例
启动数据库
使用指令startup
启动一个数据库
启动步骤:shutdown→nomount(实例启动)→mount(控制文件打开)→open(控制文件描述的所有文件被打开)
关闭数据库的四种模式
关闭模式 | abort | immediate | transactional | normal |
---|---|---|---|---|
描述 | 称为终止关闭方式,终止关闭方式具有一定的强制性和破坏性。强制中断任何数据库操作 | oracle不但会立即中断当前用户的链接,而且会强行终止用户的当前活动事物,将未完成的事物回退 | 阻止任何用户建立新的连接,等待所有活动事物提交后,再断开用户连接,当所有的活动事物提交完毕,所有的用户都断开连接后,将关闭数据库 | 阻止任何用户建立新的连接,等待当前所有正在连接的用户主动断开连接,当所有的用户都断开连接后,将立即关闭数据库 |
允许新的接入 | × | × | × | × |
等待直到当前会话都结束 | × | × | × | √ |
等待直到当前事务都结束 | × | × | √ | √ |
强制执行checkpoint并关闭所有文件 | × | √ | √ | √ |
- normal、transactional、immediate
等待数据块高速缓冲区内容全部写入数据文件、未提交的事务回滚、释放资源后才关闭。
这样关闭后数据库能够保持一致性,重新启动不需要进行实例恢复。 - abort
已经修改的数据块缓冲区内容不会写入数据文件、未提交的事务也不会回滚。
这样关闭的数据无法保证一致性(脏数据库),重新启动后,必须将改变的信息写入重做日志文件、使用回滚段来回滚未提交的改变、且需要释放资源。
备份
备份形式
- 全库备份
- 按用户备份
- 按表备份
- 表空间备份
监听程序的管理
查看监听程序的状态:
%lsnrctl status
PL/SQL
优点
- 允许嵌入sql语句、允许定义常量和变量、允许过程语言结果、允许使用异常处理
- 能提高程序的运行性能,降低网络开销
- 提供模块化程序设计功能
- 具有控制语句
- 有良好兼容性
变量可见性
变量的作用域从声明部分开始到块的结束。变量的可见性是可以访问变量引用部分(嵌套块声明了相同变量,外部变量被屏蔽) ,可以用标签引用外部变量outer.v_value
判断if/else
DECLAREnum INTEGER := -11;
BEGINIF num < 0 THENdbms_output.put_line('负数');ELSIF num > THENdbms_output.put_line('正数');ELSEdbms_output.put_line('0');END IF;
END;
循环LOOP…EXIT…END
DECLAREv_num INTEGER := 1;v_mix INTEGER := 1;
BEGINLOOPv_mix := v_mix + v_num;v_num := v_num + 1;IF v_num > 5 THENEXIT;END IF;END LOOP;
END;
循环LOOP…EXIT WHEN…END
DECLAREv_num INTEGER := 1;v_mix INTEGER := 1;
BEGINLOOPv_mix := v_mix + v_num;v_num := v_num + 1;EXIT WHEN v_num > 5;END LOOP;
END;
循环while…LOOP…END LOOP
DECLAREv_num INTEGER := 1;v_mix INTEGER := 1;
BEGINWHILE v_num < 5 LOOPv_mix := v_mix + v_num;v_num := v_num + 1;END LOOP;
END;
循环for…IN…LOOP…END LOOP
DECLAREv_mix INTEGER := 1;
BEGINFOR v_num IN 1..5 LOOPv_mix := v_mix * v_num;END LOOP;
END;
储存过程
CREATE OR REPLACE PROCEDURE 过程名
[(参数名 in|out|in out 类型名)] is
过程体
计算一个数的阶乘
CREATE OR REPLACE PROCEDURE proc(i_num in INTEGER,o_mix out INTEGER) isv_mix INTEGER := 1;v_num INTEGER := 1;
BEGIN WHILE v_num <= i_num LOOPv_mix := v_num * v_mix;v_num := v_num + 1;END LOOP;o_mix := v_mix;
END;
交换两个数
CREATE OR REPLACE PROCEDURE(io_num1 in out NUMBER,io_num2 in out NUMBER)isv_temp NUMBER;
BEGIN v_temp := io_num1;io_num1 := io_num2;io_num2 := v_temp;
END;
两个表join,输出字段
DECLARETYPE t_rec IS RECORD(email account.email%TYPE,pw signon.password%TYPE);t_acc t_rec;
BEGINSELECT account.email, signon.password into t_acc from account inner join signon on signon.username = account.userid where account.userid = '001';dbms_output.put_line(t_acc.email || t_acc.pw);
END;
触发器
游标
定义游标
CURSOR cursor_name[(parameter1[, parameter2, ...])][return datatype]
is select_statement; -- 但不能使用INTO子句
打开游标
OPEN cursor_name[value1, value2, ...];
不能用open语句重复打开一个游标
提取数据
FETCH cursor_name into {variable_list | record_variable};
variable_list表示table属性定义的数组
record_variable表示表名或游标名定义的record变量(使用%rowtype)
关闭游标
CLOSE cursor_name;
游标实例
DECLARE CURSOR cur is select account.userid from account;v_userid account.userid%TYPE;
BEGINopen cur;fetch cur into v_userid; -- 必须先fetch,cur%found才会为trueWHILE cur%FOUND LOOPdbms_output.put_line(v_userid);fetch cur into v_userid;END LOOP;CLOSE cur;
END;
使用for循环语句可以省去open、fetch和close语句,且无需判断是否结束
DECLARE CURSOR myCur ISSELECT dep_name FROM departments;
BEGIN FOR v_emp IN my_CUR LOOP -- 甚至连变量声明都可以省略dbms_output.put_line(v_emp.dep_name); -- 注意:即使游标只查询一个字段,for循环的隐式变量依然是复合类型END LOOP;
END;
更进一步,可以在for中隐式声明游标
BEGINFOR v_emp IN (SELECT dep_id, dep_name FROM departments) LOOPdbms_output.put_line(v_emp.dep_id);END LOOP;
END;
索引(Index)
优点:
- 提高查询速度
- 提高分组排序的速度
缺点
- 创建和维护索引需要耗费时间
- 索引需要物理空间
- 对表进行插入、更新和删除时,索引需要动态维护
类别
- B_tree单列索引
基于单个列创建的索引 - B_tree复合索引
基于多列创建的索引 - 位图索引
- 函数索引
使用列上的函数值作为key,而不是直接使用列的值 - 反向索引
- 分区索引和全局索引
OceanBase
产品特性
- 高可用
- 分布式
- 兼容性
- 高性能
- 低成本
- 多租户