数据库学习
- 一. B+ Tree索引是大多数DBMS缺省的索引类型,请详细描述一下几个问题
- 二. 逆范式
- 三. 描述在 DBMS 中SQL语句的执行过程,并对各个步骤所花费的代价大小进行描述和比较(2015)
- 四.简述查询优化器的工作原理和局限性(2019)
- 五.为减少查询优化器需要考虑的查询计划的个数,查询优化器可采用一系列的启发式方法减小搜索空间,请列出三条,并解释原因(2013)
- 六.使用索引降低效率举例
- 七.请详细描述以下不同的数据库应用结构之问的差异和各自的优劣以及使用的场景的差别(2015)
- 八.请详细描述 DBMS中缺省数据存储方式堆文件是如何对数据组织的(包括静态组织、插入操作、更新操作、数据读取等),为什么大多关系型商用数据库会采用堆文件 作为缺省的数据组织方式,堆文件相比其他文件组织形式的优点在哪里?(2015)
- 九.为什么说关系数据库比层状/网状数据库更“科学"?
- 十.一个运行一段时间的大型数据库系统中有一条 SQL语句变慢了,查询特别耗时间,猜测什么原因,你该怎么做?
- 十一.DBMS中的各种索引
- 十二.不同存储引擎的索引处理方式(2021)
- 十三.大数据和高并发(2021)
- 十四.定义结果集的查询条件(2021)
- 十五.请举例数据库中的约束
- 十六.空值的含义是什么?在不同数据库中的实现又是怎样的
- 十七.请举例描述邻接模型和物化路径模型将树状结构存储到关系表结构的设计方法,并通过不同的查询(包括自顶向下的查询、自底向上的查询、集合查询)来比较不同表结构设计下 SQL的效率
- 十八.高并发下的为了确保性能,锁的解决方案是什么样的?解決资源竞争有哪些方法?
- 十九.关系数据库(Relational DataBase)中的关系(Relational)的具体含义是什么?
- 二十.三范式
- 二十一.NOSQL 和SQL 比较(2017)
- 二十二.数据库的事务隔离级别(2021)
- 二十三.请描述锁机制和多种锁类型(至少三种),并举例说明以及描述其应用场景?大部分锁机制都是数据库配置后自 动执行,但请举例描述哪些情况下,必须由程序员利用程序语言控制并发更新?
- 二十四.简述数据库的发展流程,为什么会产生这种发展变化
- 二十五.什么是分区(Partition)?根据分区键(Partition Key)的类型分类,分区有哪几种类型?
- 二十六.为什么没有使用索引(2021)
- 二十七.整体层面的性能优化考虑
- 二十八.解释事务和程序还有他们的区别
- 二十九.完整性约束的含义和内容
- 三十.排它锁,共享锁,死锁,活锁
- 三十一.数据库设计的步骤
一. B+ Tree索引是大多数DBMS缺省的索引类型,请详细描述一下几个问题
1、B树索引的结构和使用方式?
结构:由根节点指向子节点。B树将索引按顺序存储,b树是一块块地将数据读取到内存块中存放一个个区间,每个区间都用指针指向下一层节点。在叶节点保存索引到的字段及其对应数据在表中的位置指针。且叶节点之间连续。
使用方式:从根节点开始搜索,通过节点中的指针进入下一级节点,比较要查找的索引值和节点中的指针大小来选择进入哪个子节点,最终要么找到对应叶节点,要么没找到。叶节点中有指向表中数据的指针。
2、B树支持的查询?
①全键值查询 Where x = 123(depth +1次的固定次数)
②键值范围 Where 45 < x < 123(先进行x=45,然后顺序读取直到 x>=123)
③键前缀查找 where x LIKE J%
3、B树的使用范围?
①仅需索引访问基本表中很少一部分的行时。(检索的结果集与集体的百分比为10%以下)
②虽然查询行数多,但当索引包含多个字段且访问字段全部包含在索引中时。
4、为什么系统为外键构建索引是普遍的要求?
为确保数据的完整性,对主表操作时,需要对参照表加锁。如果外键没有索引,查找子记录就很慢,且参照表被锁的时间会很长,进而使很多更改操作阻塞。甚至可能死锁。
*例外:被参照表很少被修改,或只在某段没有其他活动的时候进行修改。(盲目为外键加索引可能引起索引重复)
5、描述 Oracle 中一种类似B 树索引结构的物理组织形式索引组织表(IOT)的结构和应用范围?
结构:在主键索引中存储表的所有数据,表即是索引,严格排序的结构,记录在其内部有序
应用范围:代码查询表,全索引表等
二. 逆范式
1、什么是逆范式(反范式)?
指通过放弃规范化,增加冗余来提高数据库读性能。但要注意控制冗余。
2、你认为判断何时该使用逆范式的条件有哪些?
系统有相对比较低的修改率和较高的查询率时可以选择打破范式。
①合并一对一关系,可能会导致NULL、大量空间浪费等问题。
②一对多关系复制非关键字属性,例如订单的金额和货品的金额,一般会使用触发器来同步修改属性。
③一对多关系复制外部关键字,如果实体A访问实体C一定要通过实体B,那么我们可以在C中复制关键字 A,直接关联避开 B
④多对多关系复制属性:将title、用户名等信息添加到关联关系中。
⑤引入重复组:引入地址、电话号码等,主表中可以存放一个缺省的地址和电话号码来避开连接查询。
⑥创建提取表:合并基本表和查找表。
⑦分区
三. 描述在 DBMS 中SQL语句的执行过程,并对各个步骤所花费的代价大小进行描述和比较(2015)
1、执行过程:
①语法分析:分析语句的语法是否待合规范,衡量语句中各表达式的意X,
②语义分析:检查语向中涉及的所有数据库对象是否存在,且用户有相应的权限。
③视图转换:将涉及视图的查询语句转换为相应的对基表查询语句。
④表达式转换:将复杂的SQL表达式转换为较简单的等效连接表达式。
⑤选择优化器:不同的优化器一般产生不同的“执行计划”。
⑥选择连接方式表:Oradle 有三种连接方式,对多表连接 Oradle 可选择适当的连接方
⑦选择连接顺序:对多表连接 Oradle 选择哪一对表先连接,以及哪个表作为源数据表。
⑧选择数据的搜索路径:根据以上条件选择合适的数据搜索路径,如是选用全表搜索还是利用索引或是其他的方式。
⑨运行“执行计划”。
2、代价比较:
①语法分析:分析语句的语法是否符合规范。代价小。
②语义分析:分析语句含义,检查用户对数据库是否有相应权限。代价小。
③解析:分为硬解析和软解析。若在共享池中没有找到已有的执行计划,则进行硬解析,否则为软解析。硬解析指使用优化器对sql 语句进行优化,将sql转化为一些等价语句,并选择代价最小的语句生成执行计划。软解析指在共享池中已经存在对应的执行计划,则不再进行优化,直接使用该执行计划。硬解析的代价最大,软解析较小(可作硬/软解析区别的答案)
④运行执行计划,返回执行结果。运行执行计划的代价根据sq| 语句的不同可大可小。
结论:比较下来,**“解析“**耗费资源的代价最大,因此应该极力避免解析的产生。
四.简述查询优化器的工作原理和局限性(2019)
工作原理:
借助关系理论(关系代数)提供的语义无误的原始查询进行有效的等价变换,寻找最优路径,产生性能最优的执行方案。(请参照执行解析过程中的各个步骤)
局限性:
①查询优化器不能发现SQL本身表达逻辑的错误
②查询优化器不能优化查询的中间结果集
五.为减少查询优化器需要考虑的查询计划的个数,查询优化器可采用一系列的启发式方法减小搜索空间,请列出三条,并解释原因(2013)
①尽可能早地执行选择运算
②尽可能早地执行投影运算
③把笛卡尔积与附近的一连串选择和投影合并起来运算
使用这了条启发式优化规则,可以使计算时尽可能减少中间关系的数据量。
六.使用索引降低效率举例
①使用 select count(*) from T,而且T上有索引,但是优化器仍然全表扫描。
②对于一个有索引的列作出函数查询
七.请详细描述以下不同的数据库应用结构之问的差异和各自的优劣以及使用的场景的差别(2015)
(1)集中式数据应用和分布式数据应用:
分布式数据库效率更高。
集中式数据库:优点:数据集中化:提高数据库速度,并且在部署上服务离数据越近,速度会越快。Block 使用充分,命中率高,所需IO操作少;缺点:单点故障,会带来很大损失,解决方式是热备份或灾难备份。
分布式数据库:优点:具有更灵活的体系结构,减少了单一节点的负担。缺点:远程数据的透明引用访问代价很高;不同的数据源数据结合极为困难。存取结构复杂,保密性不易控制;多个副本的一致性难以保证。
应用场景:集中式数据库的主要适用于组织或者地理分布集中、对数据库性能要求高而对拓展性可可靠性要求相对较 低的数据库系统。分布式数据库与集中式正好相反,主要应用在组织或者地理上分布的单位的场合或者为了增加数据 的可靠性而需要适当增加数据冗余程度的场合(所谓组织和技术两方面的原因)。
适合的应用:银行的自动提款机(ATM)采用的就是集中式数据库,万维网采用的就是分布式数据库。
(2) 同步数据处理和异步数据处理;
同步数据处理的优势是可以保持数据的一致性和实时性,但是如果业务流程过于复杂会导致单事务等待时间过长,造成死锁或其他用户体验差的状况。
异步数据处理的优势在于异步性不会造成事务流程等待,适合大规模的批处理应用和 异构通讯应用。
同步数据处理广泛应用于各种应用环境,异步通信应用常见的应用场景包括银行业每天的银行间批处理清算,数据集成中异步消息通讯等等。
八.请详细描述 DBMS中缺省数据存储方式堆文件是如何对数据组织的(包括静态组织、插入操作、更新操作、数据读取等),为什么大多关系型商用数据库会采用堆文件 作为缺省的数据组织方式,堆文件相比其他文件组织形式的优点在哪里?(2015)
堆文件是最简单、最基本的文件结构。
①数据库的最小单位是块。
②堆文件对块的插入是随机。
③堆文件的插入是有 freesize 的限定的。
④堆文件的读取是按照块进行读取到内存的,然后再在内存中寻找具体的记录。
⑤堆文件块记录的更新可能会造成行迁移,从而造成读取单一记录需要读两个块(2次I/O操
作)
数据库有很多其他的文件组织形式,比如在 Oracle 中的10T,及其他很多数据库中的聚族文件等,堆文件的随机性使其插入更新刷除查询效率都很均衡,而其他的文件形式大多是顺序文件,会造成某一种类型的查询效率很高但是其他的操作效率大幅度下降。
九.为什么说关系数据库比层状/网状数据库更“科学"?
①层次性数据库最早出现:存在逻辑嵌套,而不是线性排列,适用于部分场景,耦合性过强限制了我们对数据的自由操作
②网状数据库(多层次连接):灵活多了,但是数据操作还是困难。
③关系型数据库在灵活性、数据访问、数据的组织找到了很好的平衡点,是场景普适的存储方式,对于特定的存储不太合适。
十.一个运行一段时间的大型数据库系统中有一条 SQL语句变慢了,查询特别耗时间,猜测什么原因,你该怎么做?
①数据量增加对性能的预估
1.隐藏在查询背后对数据量的高敏感性
2.比如max0对高数据量的敏感,而直接引起子查询性能缓慢降低,必须使用非关联子查询。
②排序的影响:最关键的问题是排序的数据是否都在内存中(有无磁盘消耗)
1.字节数量而不是记录数量
2.也就是被排序的总数据量
3.Join 应该延后到查询的最后阶段:对尽可能少的数据进行排序
③Join 延迟到查询的最后阶段
1.例子:查询一年内的10大客户的名称和地址
2.目标,对尽量少的数据进行排序
十一.DBMS中的各种索引
什么是索引:索引是关系数据库中对某一列或多个列的值进行预排序的数据结构。
①哈希索引:
结构:哈希索引是对索引键值进行哈希计算,将得到的结果作为键值创建索引
适用范围:
1.哈希索引支持全键值查询、=、in、不等于等运算
2.哈希索引不支持部分键值匹配、排序、原字段顺序查询
3. 如何避免哈希冲突:使用二次哈希法或者链表法(参考 HashMap)
②位图索引:
结构:
1.位图索引的索引存储指向多行的指针。
修改
2.位图索引每次修改都会锁住全部索引,对于低选择字段建议不要修改或尽可能小的
用途:
1.相异基数低:即字段可以取的值比较少
2.大量临时查询的聚合
③位图联结索引:
结构:允许使用另外某个表的列对一个给定表建立索引。
**用途:**为了解决位图索引中更新导致全表锁定的问题。
④函数索引:
含义:函数索引也就是对F(x)的值构建索引,在通过对索引读取 ×所指向的记录行。
用途:
1.不区分大小写的查询:使用函数输入(构建一个全大写的函数索引)
2.T、F的巨大差异下的索引:(True / False)如何找到少量的F(函数索引:T映射到NULL, F 映射到非空,然后对该函数建立索引,建立索引的结果全为 False)
3.有选择的唯一性:Active 的活动的名称不能相同 Create unique index active_project.
must_be_ unique on projects(case when status =‘ACTIVE’ then name end),这样子只要有一个创建,另一个只能回滚。
⑤反向键索引或逆向索引
含义:将索引的字段翻转过来作为索引的键值
用途:用来解决高并发下的系统生成键的创建和插入问题
十二.不同存储引擎的索引处理方式(2021)
对于B+树索引,不少数据库都有自己的处理方式,比如,MySQL中不同的存储引擎使用了不同的方式把索引保存到磁盘上,他们会影响性能。
1.MyISAM 使用前缀压缩以减少索引,而 InnoDB 不会压缩索引
2.MyISAM 索引按照行存储的物理位置引用被索引的行,但是 InDB 按照主键值引用行
十三.大数据和高并发(2021)
每个数据库对数据量敏感度的变化是不一样的,不同操作优化方式不一样,先要知道是哪类事
务:
影响不大:主键检索等值单一查询。(用 cursor 进行显性范围,只要向下搜索索引,扫描速度比迭代处理快两倍,因为迭代处理每次都要向下访问B树)
线性影响:返回记录数量和查询毫无关系,例如 SQI操作的数据和最后返回的结果无关(聚合函数)。可选的唯一方法:引入其他条件(例如时问范围),设定上限、不是单纯的技术问题、还依赖于业务需求。
非线性影响:排序性能减低间歇性。因为较小型的排序全部在内存中执行,而较大型的排序(涉及多个有序子集的合并)则需要将有序子集临时存储到硬盘中。所以通过调整分配给排序的内存数 量来改善排序密集型操作的性能是常见且有效地调优技巧。
注意事项:
*max0对高数据量的敏感。而直接引起子查询性能缓慢降低.必须使用非关联子查询
*排序的影响:字节数量而不是记录数量,也就是被排序的总数据量。因此Join 应该延后到查询的最后阶段
*谨慎使用关联嵌套子查询
*通过分区提升性能是有瓶颈的
*数据清除的风险(truncate)
*关注不同的数据操作(insert、update、delete)的整体成本的高低
十四.定义结果集的查询条件(2021)
①对过滤条件进行优化
1.好条件:能过滤掉不满足条件的数据多
2.坏条件:同样
②exists 和 in 可以暗示在哪里进行优化
③降低表连接次数
1.改写 SQL
2.设计(反范式等):1对1合并、1对多合并等等
十五.请举例数据库中的约束
检查约束:在定义数据表的时候,在字段级或者表级加入检查约束,使其满足特定的要求。
非空约束:即不为null在字段后面直接加 not null 即可。
唯一性约束:定义一个唯一性约束,但并不包括 NULL 值,直接在字段定义后加入 unique 即可定义
主键约束:实质就是唯一性约束+非空约束
十六.空值的含义是什么?在不同数据库中的实现又是怎样的
在关系元组中允许出现空值,表示信息的空缺,即未知的值或不存在的值。
如果判断(NULL == NULL);Sybase 返回 true; Oracle 返回 NULL;且 Oracle 不会为完全为空值的项目构造 B树索引。
十七.请举例描述邻接模型和物化路径模型将树状结构存储到关系表结构的设计方法,并通过不同的查询(包括自顶向下的查询、自底向上的查询、集合查询)来比较不同表结构设计下 SQL的效率
主要有三种树状结构存储:
①邻接表模型
1.层次中父节点 id 作为子节点id 的一个属性 pid,不能确定兄弟节点的排序
2. 难以处理的,是递归的
对于邻接表模型来说,它使用非关系型查询方式(使用关键字 connect by)。因为是非关系型查询方式,对邻接表模型来说,不管是自底向上的查询还是自顶向下查询,效率都是一样的。
②物化路径模型
1.将树中间的每一个节点和在树中的位置描述成数据的结合
2.是所有子节点的祖先节点的id 的串联(1.2.3)
3.能够知道兄弟节点之间的排名,家谱
对于物化路径模型来说,它用一个字段来表示层次结构,它不仅标识了父子关系,还固定了兄弟之间的顺序。但对它来说,自顶向下查询远比自底向上查询快。
③嵌套模型
1.每一个节点被赋予了一对数字(left number 和 right
2.父节点的左数字和右数字之间包含了它所有的子节点的左数字、右数字对于嵌套模型来说,它通过左右节点标号的方式来确定每个节点的位置。以后续的方式深度 优先编号。对嵌套模型来说,不管是自底向上还是自顶向下,其效率差别不大,只是在排序上有出入。
最终来说:自底向上方式查询效率:邻接表模型>物化
自顶向下方式查询效率:邻接表模型 >物化路径模型>嵌套模型
十八.高并发下的为了确保性能,锁的解决方案是什么样的?解決资源竞争有哪些方法?
锁的解决方案:
①不要随便使用表级锁,尽量使用细粒度锁
②只有使用了索引才能使用行锁
③尽量缩短加锁的时间
a.需要频繁的提交,但是不建议批处理文件这么做
b. 数据库开销最大的是日志的记录
解决资源竞争的方法:
①DBA 解决方案:与业务逻辑弱相关或无关
a.事务空间 (Transaction space):调整事务锁占空间的大小,事务条目占用是重要原因,DBA 可以增加分配给事务条目的空间来解决
b. 可用列表(Free list):insert操作在不同物理块中,可以借助存储管理手段
②架构解决方案
a. 分区 (Partitioning)
b. 逆序索引(Reverse index)
c. 索引组织表(Index organized table):原本资源竞争包括基本表和索引,但是现在索引和基本表合并了,可以降低冲突发生的位置
③开发解决方案
a. 调节并发数:限制最高的 session 数量
b. 不使用系统产生键:如果键没有意义,那不妨使用随机值
在 insert 和 session 等情况下的表现:
①DBA:不显著
②架构:索引强制约束,导致索引的竞争增加,导致CPU 计算资源成为瓶颈
③开发者:小范围生成随机数(2倍预计)会导致多次碰撞(还有 redo的消耗),大范围生成随机数则没有这个碰撞(100倍)
十九.关系数据库(Relational DataBase)中的关系(Relational)的具体含义是什么?
一个关系就是一个二维表,在 Access 中,一个关系存储为一个表。
二十.三范式
INF: 同一列中不能有多个值,即实体中某个属性不能有多个值或不能有重复的值(确保原子
性
2NF: 满 足1NF 且要求DB表中的每个实例或行必须可以被组成的主键的所有列唯一地区分(检查对键的完全依赖)
3NF: 满足 2NF且要求一个数据库表的非主关键字只能被主关键字区分(检查属性的独立
性)
二十一.NOSQL 和SQL 比较(2017)
SQL 指关系型数据库,NOSQL泛指非关系型数据库;SQL 中数据存储在特定的表中,NoSQL 中数据存储方式可以是JSON 文档、哈希表或其他方式。SQL 中必须定义好表和字段结构后才能存储数据,在NOSQL 中数据可以在任何时候任何地方添加,不需要先定义表。SQL中如果需要增加外部关联数据的话,规范化做法是在原表中增加一个外键,关联外部数据表。
而 NOSOL 除了这种规范化外部数据表的做法外,还能采用非规范化方式把外部数据 直接放到原数据集中。
应用场景:关系型数据库适合存储结构化数据,这些数据的规模、增长速度通常是可预期的;NOSQL适合存储非结构化数据,这些数据通常是海量的,而且增长速度是难以预期的。SQL 具体应用 MYSQL、Oracle; NoSQL 具体应用:MongoDB、Redis
二十二.数据库的事务隔离级别(2021)
三种问题:
①脏读:读到了其他事务未提交的数据
②不可重复读:执行 SELECT操作时没有获得读锁或 SELECT 操作值执行完成后立刻释放了锁,而另一个事务对数据进行更新得到了不同的结果
③幻读:不可重复读的一种特殊场景,事务1两次 Select检索一定范围内的数据,事务2在两次之间创建了一条新的符合检索条件的记录,导致两次查询的结果集不同。
四种隔离级别:
①未提交读:一个事务开始写数据时,另一个事务不可以写数据,但是可以读数据,
②已提交读:读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将禁止其他事务访问该行,会对该写锁一直保持直到事务提交。
③可重复读:介于已提交读和可串行化,是 InnoDB的默认隔离级别。当使用可重复读隔离级别时,在事务执行期间会锁定该事务以任何方式引用的所有行。
④可串行化:要求在选定对象上的读锁和写锁保持直到完成事务结束后才能释放。
- 通过读已提交解决脏读
- 通过可重复读解决不可重复读
- 通过可串行化解决幻读
*注:MySQL 中可重复读,理论上无法避免幻读,但实际上几乎不会产生幻读(仅有一种特例)
二十三.请描述锁机制和多种锁类型(至少三种),并举例说明以及描述其应用场景?大部分锁机制都是数据库配置后自 动执行,但请举例描述哪些情况下,必须由程序员利用程序语言控制并发更新?
锁机制,锁是计算机协调多个进程或纯线程并发访问某一资源的机制。事务T在对某个数据对象(如表、记录等)操作之前,先向系统发出请求,对其加锁,加锁后事务T就对数据库对象有一定的控制,在事务T释放它的锁之前,其他事务不能更新此数据对象。
数据库层面的锁一般叫悲观锁,因为它很悲观的认为,自己的数据一直是不安全的,每次数据操作时,一定会有其他程序也来修改自己。锁类型有共享锁、更新锁和排他锁等。共享锁;你如果只是读数据,请加上这把锁,这样别的程序禁止修改这个数据.别的数据也能加共享锁来读。排它锁:你要修改数据,那么加排它锁,让别人连读都读不了,你先改,改完了,把锁去了,别人才能加共享锁来读。更新锁:介于共享锁和排他锁之间的锁,用来避免两人同时申请排它锁造成死锁问题的锁。这些数据库层面的锁是为了避免几种脏读,幻读,不可重复读的手段。
程序层面的锁叫乐观锁,一般在抢票、抢红包、抢商品等抢占业务中会用到。一般是为数据加一个 version 字段,每次修改数据时,就将这个字段+1。例如A程序要修改某个字段,修改前要读取其有效字段,和 version 字段,假设当前 version 字段是10,然后A程序拿着数据去操作了,操作完了,要修改这个数据,按理说 A 程序操作完这个数据.要给 version+1,意味着我改了一次.但是他真正提交数据前,还要再读取一次 version,看看还是不是10,因为如果不是10了,说明,在我拿着数据去操作的过程中,有其他程序操作了这个数据,并且已经修改了这个数据,那么我刚才做的这一些都是无用功。所以这时候,我还修改数据干啥?这个 version 就是程序定义出来的字段.用来给程序去判断,这条数据现在安全么,是不是可靠可修改的数据.如果我前后读到的 version 是一个值,说明没人来干扰,那么我就可以放心的提交事务,修改数据了这就是程序层面的锁机制,他需要去判断一下是不是有人参与这条数据的操作:没人参与就正常,有人参与再去处理,例如一般回退或者其他处理办法。
二十四.简述数据库的发展流程,为什么会产生这种发展变化
A.人工管理阶段
人工管理阶段是指计算机誕生的初期(B).20世纪 50.年代后期之前),这个时期的计算机,主要用于科学计算。从硬件看,沒有磁盤等直接存取的存储设备:从软件看,沒有操作菜统和管理数据的软件,数据处理方式是批处理。
这个时期数据管理的特点是:
1.数据不保存
2.没有对数据进行管理的软件系统
3.没有文件的概念
4.一组数据对应于一个程序,数据是面向应用的
B.文件系统阶段
文件系统阶段是指计算机不仅用于科学计算,而且还大量用于管理数据的阶段(从50年代后期到60年代中期)。在硬件方面,外存储器有了磁盘、磁鼓等直接存取的存储设备。在软件方面,操作系统中已经有了专门用于管理数据的软件,称为文件系统。
1.数据需要长期保存在外存上供反复使用
2.程序之间有了一定的独立性
3.文件的形式已经多样化 4.数据的存取基本上以记录为单位
C.数据库系统阶段
数据库系统阶段是从 60年代后期开始的。在这一阶段中,数据库中的数据不再是面向某个应用或某个程序,而是面向整个企业(组织)或整个应用的。
数据库系统阶段的特点是:
1.采用复杂的结构化的数据模型
2. 较高的数据独立性
3.最低的冗余度
4. 数据控制功能
二十五.什么是分区(Partition)?根据分区键(Partition Key)的类型分类,分区有哪几种类型?
分区就是将一个大表根据条件分割成若干个小表,是一种数据分组方式。
哈希分区:把不同的列随机平均的分布到不同的物理环境,达到备份和恢复(写 undo 和redo 文件)效率高,降低 错误回滚压力(为了管理)。
范围分区:把字段的值分布到一个物理范围,这个范围是你在创建分区时指定的分区 键决定的。这种分区方式是最为常用的。
列表分区:把不同的列存到不同的物理环境,某列的值只有几个,容易按值进行分区。
二十六.为什么没有使用索引(2021)
①我们在使用B+树索引,而且谓词中没有使用索引的最前列:表T,T(X,Y)上有索引,做SELECT * FROM T WHERE Y=5,跳跃式索引(仅 CBO)
②使用 SELECT COUNT(*)FROM T’,而且T上有索引,但是优化器仍然全表扫描,所以使用
count(1)
③对于一个有索引的列作出函数查询:Select * from t where f(indexed_col)= value
④隐形函数查询(主要是时间和类型变化这种隐形函数查询):隐形的过程导致没有使用索引。
不等于符“<>"会限制索引,引起全表扫描,如果改成 or 就可以使用索引了。“isnull 查询条件也会屏蔽索引。
⑤此时如果用了索引,实际反而会更慢。数据量不够大,不用索引更划算。
⑥没有正确的统计信息,造成CBO无法做出正确的选择
总结:归根到底,不使用索引的通常原因就是"不能使用索引,使用索引会返回不正确的结果”,或者“不该使用索引,如果使用了索引就会变得更慢"
二十七.整体层面的性能优化考虑
①IO负载低,CPU负载高可能是哪些情况?
1.内存不够
2.磁盘性能差(磁盘问题、raid 设计不好、raid 降级)
3.SQL 的问题
4.并发锁机制的问题
5.事务设计问题,大量小数据IO
6.大量的全表扫描
②IO负载高,CPU 负载低可能是哪些情况?(2021)
(2021
1.大量小的IO执行写操作
2.Autocommit,产生大量小IO
3.大量大的IO执行写操作
4.SQL 的问题
5.IO/PS 磁盘限定一个每秒最大IO次数
③IO和CPU 负载都高可能是哪些情况?
1.硬件不够用了
2.SQL 存在问题
3.性能问题,90%的问题来源都是程序员的问题
4.开发环境到生产环境是一场灾难
二十八.解释事务和程序还有他们的区别
事务:事务是数据库提供的一种手段,通过这一手段,应用程序员将一系列的数据库操作组合在一起作为一个整体以便数据库系统提供一组保证,即事务的 ACID 性质。
程序:由序列组成,告诉计算机如何完成一个具体的任务。
二十九.完整性约束的含义和内容
含义:关系完整性是为保证数据库中数据的正确性和相容性,对关系模型提出的某种约束条件或规则。包括域完整性,实体完整性、参照完整性和用户定义完整性,其中域完整性,实体完整性和参照完整性,是关系模型必须满足的完整性约束条件。
①域完整性:域完整性是保证数据库字段取值的合理性
SQL 约束:检查(CHECK)、默认值(DEFAULT)、不为空(NOT NULL)、外键(FOREIGN KEY) 等约束
②实体完整性:若属性(指一个或一组属性)A是基本关系R的主展性,则A不能取
③SQL约束:Primary Key & Unique
④参照完整性:若属性(或属性组)F是基本关系R的外码,它与基本关系S的主码K相对应(或者说F引用了K,则对于R中每个元组在F上的值必须为:取空值或者等于S中某个元组的主码值
用户定义的完整性:针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求
三十.排它锁,共享锁,死锁,活锁
排它锁:又称写锁(X锁),若事务工对数据对象A加上X锁,则事务T既可以读A也可以修改A,其他事务不能再对A加任何锁,直到工释放A上的锁。这保证了其他事务在工释放
A上的锁之前不能再读取和修改A。
共享锁:又称读锁(S锁)、若事务工对数据对象A加上S锁,则事务下可以读A但不能修改A,其他事务只能再对A加S锁,而不能加x锁,直到工释放A上的S锁。这保证了其他事务可以读A,但在工释放A上的s锁之前不能对A作任何修改。
死锁:如果事务T1封锁了数据R1,事务T2封锁了数据R2,然后T1又请求封锁R2,由于T2 已经封锁了 R2,于是T1 等待T2释放 R2上的锁。接着T2又请求封锁R1,由于T1 已经封锁了R1.于是T2也只能等待T1 释放 R1上的锁。于是T1 和T2 相互等待,T1和T2 两个事务永远也不能结束,形成死锁。
活锁:如果事务T1封锁了数据&,事务T2又请求封锁R,于是T2 等待。T3又请求封锁R,当T1释放了R上的封锁后系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁 R,T3释放了R上的封锁后系统首先批准了T4的请求…T2有可能永远等待,这就是活锁的情形
三十一.数据库设计的步骤
需求分析,概念结构分析,逻辑结构分析,物理结构分析,数据库实施,数据库实施。
1)需求分析:进行数据库设计首先必须准确了解和分析用户需求(包括数据与处理)
2)概念结构分析:通过对用户需求进行综合,归纳与抽象,形成了一个独立于具体DBMS 的概念模型。
逻辑结构分析(ER 图):逻辑结构设计是将概念结构转换为某个 DBMS 所支持的数据模型,并将进行优化。
3)物理结构分析:物理设计是为逻辑数据结构模型选取一个最适合应用环境的物理结构(包括存储结构和存取方法)
4)数据库实施:设计人员运营 DBMS 提供的数据库语言(如S1)及其宿主语言,根据逻辑设计和物理设计的结果建立数据库,编制和调试应 用程序,组织数据入库,并进行试运
行
5)数据库运行和维护:数据库应用系统经过试运行后,即可投入正式运行,在数据库系统运行过程中必须不断地对其进行评价,调整,修改。