黑龙江省城乡和住房建设厅网站首页,江苏省建设厅网站是,wordpress登录页面打不开,网站分享正能量历年试题2024年05月试题 BCN范式#xff0c;模式分解#xff0c;触发器类型2023年05月试题 NoSQL基本特点#xff0c;NoSQL对比#xff0c;混合数据库2022年05月试题4 两段锁#xff0c;事务并发#xff0c;数据一致#xff0c;本地事务发布20…历年试题2024年05月试题 BCN范式模式分解触发器类型2023年05月试题 NoSQL基本特点NoSQL对比混合数据库2022年05月试题4 两段锁事务并发数据一致本地事务发布2021年05月试题4 云数据库、数据库设计、看图填空2020年11月试题4 索引过多缺点物理分区主从复制2019年05月试题四 读写分离、主从复制,mxsgl,关系数据库和nosgl2018年05月试题四 视图查询性能数据不一致触发器等2017年05月试题2 数据库设计阶段候选键联系类型范式2017年05月试题4 反规范化技术物理分区水平垂直分区2016年05月试题4 不规范化问题并发操作读写锁机制e2013年05月试题4 不规范化问题反规范化优缺点水平分割2011年05月试题4 关系数据库和nsglngsql存储类型问题2010年05月试题2 原型分析分布式和集中数据库e2010年05月试题4 数据仓库联邦数据库数据集成方案判断
1.数据库体系结构 1.1 集中式数据库
1.1.1 三级模式 关系的3中类型
基本关系通常又称为基本表或基表实际存在的表实际存储数据的逻辑表示。
查询表查询结果对应的表。
视图表由基本表或其他视图表导出的表本身不是独立存储数据库值存放它的定义常称为虚表
视图
概念
它是一个虚拟表逻辑上的表其内容由查询定义仅保存SQL查询语句它是从一个表或多个表或视图导出的表。
同真实的表一样视图包含一系列带有名称的列和行数据。但是视图并没有真正存储这些数据而是通过查询原始表动态生成所需要的数据。在对视图的数据进行操作时系统根据视图的定义去操作与视图相关联的基本表。
优点
视图能简化用户操作视图使用户能以多种角度看待同一数据视图对重构数据库提供了一定程度的逻辑独立性视图可以对机密的数据提供安全的保护。
物化视图
1概念
它不是传统意义上的虚拟视图是实体化视图其本身会存储数据。同时当原始表中的数据更新时物化视图也会更新。 物化视图是包括一个查询结果的数据库对象它是远程数据的的本地副本或者用来生成基于数据表求和的汇总表。 物化视图存储基于远程表的数据也可以称为快照类似于MYSQL Server中的snapshot静态快照 。 对于复制物化视图允许你在本地维护远程数据的副本这些副本是只读的。 如果你想修改本地副本必须用高级复制的功能。 当你想从一个表或视图中抽取数据时你可以用从物化视图中抽取。 对于数据仓库创建的物化视图通常情况下是聚合视图单一表聚合视图和连接视图。 物化视图说白了就是物理表只不过这张表通过oracle的内部机制可以定期更新将一些大的耗时的表连接用物化视图实现会提高查询的效率。当然要打开查询重写选项 2物化视图和视图的区别 物化视图和视图类似反映的是某个查询的结果 但是和视图仅保存SQL定义不同物化视图本身会存储数据因此是物化了的视图。 1.2 分布式数据库 特点
数据独立性。除了数据的逻辑独立性与物理独立性外还有数据分布独立性分布透明性。
集中与自治共享结合的控制结构。各局部的DBMS可以独立地管理局部数据库具有自治的功能。同时系统又设有集中的控制机制协调各局部DBMS的工作执行全局应用。
适当增加数据冗余度。 在不同的场地存储统一数据的多个副本可以提高系统的可靠性和可用性同时也提高系统性能。 提高系统的可用性即当系统中某个节点发生故障时因为数据有其他副本在非故障场地上对其他所有场地来说数据仍然时可用的从而保证数据的完备性。 透明性分类 2. 数据库设计过程 需求分析
需求分析通过调查研究了解用户的数据和处理要求并按一定格式整理形成需求说明书。产出物有 数据流图、数据字典、需求规格说明书
概念设计
概念设计在需求分析阶段产生的需求说明书的基础上按照特定的方法将它们抽象为一个不依赖于任何数据库管理系统的数据模型即概念模型ER模型实体、联系、属性、扩展的ER模型。 数据模型 关系模型相关概念 目或度关系模式中属性的个数 候选码候选键 主码主键 主属性与非主属性组成候选码的属性就是主属性其他的就是非主属性。 外码外键其他关系的主键 全码ALL-Key关系模式的所有属性组是这个关系的候选码。 完整性约束 实体完整性约束规定基本关系的主属性不能取空值 参照完整性约束关系与关系间的引用其他关系的主键或空值 用户自定义完整性约束应用环境决定 触发器 逻辑设计
逻辑设计将概念模型转化为某个特定的数据库管理系统上的逻辑模型。设计逻辑结构时首先为概念模型选定一个合适的逻辑模型通常是关系模型然后将其转化为由特定DBMS支持的逻辑模型最后对逻辑模型进行优化。 逻辑结构设计
一个实体必须转换为一个关系模式联系转关系模式一对一一对多多对多 物理设计
物理设计对给定的逻辑模型选取一个最适合应用环境的物理结构所谓数据库的物理结构主要是指数据库在物理设备上的存储结构和存取方法。
3. 规范化理论 思考范式级别提升带来了什么负面影响 函数依赖 定义设 R(U) 是属性集合 U{ A1, A2, … , An } 上的一个关系模式X, Y 是 U 上的两个子集若对 R(U) 的任意一个可能的关系 r r 中不可能有两个元组满足在 X 中的属性值相等而在 Y 中的属性值不等则称 “ X 函数决定 Y ” 或 “ Y函数依赖于X ” 记作 X → Y 。 键 Armstrong公理 范式 模式分解
无损分解 保持函数依赖 4. 反规范化
技术手段说明增加派生性列增加派生列指增加的列可以通过表中其他数据计算生成。它的作用是在查询时减少计算量从而加快查询速度。 例如已有“单价”和“数量”列增加“总价”列增加冗余列 重新组表指如果许多用户需要查看两个表连接出来的结果数据则把这两个表重新组成一个表来减少连接而提高性能。重新组表重新组表指如果许多用户需要查看两个表连接出来的结果数据则把这两个表重新组成一个表来减少连接而提高性能。分割表水平分割按记录进行分割把数据放到多个独立的表中主要用于表数据规模很大或表中数据相对独立或数据需要存放到多个介质上时使用。 垂直分割对表进行分割将主键与部分列放到一个表中主键与其它列放到另一个表中 在查询时减少 I/0 次数。
反规范化的优点
连接操作少检索快、统计快。需要查的表减少检索容易。
反规范化的缺点
数据冗余需要更大存储空间 无解插入、更新、删除操作开销更大 无解数据不一致可能产生添加、修改、删除异常。可借助触发器数据同步应用程序数据同步物化视图解决。更新和插入代码更难写 无解
5. 数据库功能控制 5.1 数据库安全性 5.2 并发控制
5.2.1 事务的ACID特性 5.2.2 并发产生的问题 5.2.3 并发问题解决方案 5.2.4 封锁协议
一级封锁协议。事务T在修改数据R之前必须先对其加X锁直到事务结束才释放。可防止丢失修改
二级封锁协议。一级封锁协议加上事务T在读取数据R之前先对其加S锁读完后即可释放S锁。可防止丢失修改还可防止读“脏”数据
三级封锁协议。一级封锁协议加上事务T在读取数据R之前先对其加S锁直到事务结束才释放。可防止丢失修改、防止读“脏”数据与防止数据(不可)重复读
两段锁协议。可串行化的。可能发生死锁
5.3 数据备份
冷备份也称为静态备份是将数据库正常关闭在停止状态下将数据库的文件全部备份(复制)下来。热备份也称为动态备份是利用备份软件在数据库正常运行的状态下将数据库中的数据文件备份出来。
完全备份备份所有数据
差量备份仅备份上一次完全备份之后变化的数据
增量备份备份上一次备份之后变化的数据
5.4 数据库故障与恢复 6. 数据库性能优化 6.1 集中式数据库性能优化
硬件升级处理器、内存、磁盘子系统和网络。 数据库设计反规范化技术逻辑、数据库分区物理。
索引优化策略
选择经常查询不常更新的属性、数据量小的不设置索引等。
查询优化
建立物化视图或尽可能减少多表查询等。
SQL优化
以不相干的子查询替代相干子查询只检索需要的列避免select *用带IN的条件子句等价替换OR子句经常提交COMMIT以尽早释放锁尽可能减少多表查询让自然连接和笛卡尔积运算的子表尽可能小
6.2 分布式数据库性能优化
主从复制、读写分离 数据库分片分表、分库 分布式缓存技术
分区分表分库 分区分表共性1.都针对数据表 2.都使用了分布式存储 3.都提升了查询效率 4.都降低了数据库的频繁I/O压力差异逻辑上还是一张表逻辑上已是多张表
分区技术
分区并不是生成新的数据表而是将表的数据均衡分摊到不同的硬盘系统或是不同服务器存储介质中实际上还是一张表。 使用分区技术的优点 减少维护工作量。独立管理每个分区比管理单张大表要轻松得多。增强数据库的可用性。如果表的一个或几个分区由于系统故障而不能被使用那么表其余的分区仍然可以使用如果系统故障只影响表的一部分分区那么只有这部分分区需要修复这就比修复整张大表耗费的时间少许多。均衡I/O减少竞争。通过把表的不同分区分配到不同的磁盘来平衡I/O改善性能。分区对用户保持透明。最终用户感觉不到分区的存在。提高查询速度。对大表的查询、增加、修改等操作可以分解到表的不同分区中来并行执行。 数据分区技术一般分为水平分区和垂直分区数据库中常见的是水平分区。
水平分区分为范围分区、哈希分区、列表分区等。 分区策略分区方式说明 范围分区 【RANGE】 按数据范围值来做分区例:按用户编号分区0-999999映射到分区A1000000-1999999映射到分区B. 哈希分区 【HASH】 通过对key进行hash运算分区例:可以把数据分配到不同分区这类似于取余操作余数相同的放在一个分区上。 列表分区 【LIST】 根据某字段的某个具体值进行分区例:长沙用户分成一个区北京用户一个区。
范围分区哈希分区列表分区数据值连续连续、离散均可离散数据管理能力强弱强实施难度与可维护性差好差数据分布不均匀均匀不均匀 分区的优点 1、相对于单个文件系统或是硬盘分区可以存储更多的数据。 2、数据管理比较方便比如要清理或废弃某年的数据就可以直接删除该日期的分区数据即可 3、精准定位分区查询数据不需要全表扫描查询大大提高数据检索效率。 4、可跨多个分区磁盘查询来提高查询的吞吐量。 5、在涉及聚合函数查询时可以很容易进行数据的合并。 数据库主从复制
一般一主多从也可以多主多从。 主库做写操作从库做读操作。 主从复制步骤 主库Master更新数据完成前将操作写binlog日志文件。 从库Salve打开I/O线程与主库连接做binlog dump process并将事件写入中继日志。 从库执行中继日志事件保持与主库一致。 7. NoSQL非关系型数据库
NoSQLNot-only SQL泛指非关系型数据库。
NoSQL的使用场景NoSQL的缺点不足1 数据模型比较简单 2 需要灵活性更强的IT系统 3 对数据库性能要求较高 4 不需要高度的数据一致性 5 对于给定key容易映射复杂值的环境1 成熟度不够大量关键特征有待实现 2 开源数据库产品的支持力度有限 3 数据挖掘与商务智能支持不足 4 现有的产品无法直接使用NoSQL 5 擅长NoSQL的专家较少
7.1 与关系型数据库对比
特征关系数据库模式NoSQL 模式并发支持支持并发、效率低并发性能高存储与查询关系表方式存储、SQL 查询海量数据存储、查询效率高扩展方式向上扩展向外扩展索引方式B树、哈希等键值索引应用领域面向通用领域特定应用领域数据一致性实时一致性弱一致性数据类型结构化数据非结构化事物高事务性弱事务性水平扩展弱强数据容量有限数据海量数据成本花费巨大成本高部署简单成本低开源查询速度数据存储于硬盘中SQL查询慢数据存储于缓存中查询速度快存储数据类型只支持基础数据类型结构化支持基础和对象集合等非结构化类型持久存储支持海量数据存储数据在缓存中不适用于持久存储
7.2 NoSQL数据库的种类 键值Key - Value
键可是一个字符串对象值可以是任意类型的数据。如整型、字符型、数组、列表、集合等。 列族数据库
分行式存储和列式存储。 文档数据库 图形数据库 8.缓存技术-Redis
常见缓存技术
MemCacheMemcache是一个高性能的分布式的内存对象缓存系统用于动态Web应用以减轻数据库负载。Memcache通过在内存里维护一个统一的巨大的hash表它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。
RedisRedis是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的APl。
Squidsquid是一个高性能的代理缓存服务器Squid支持FTP、gopher、HTTPS和HTTP协议。 思考数据库与缓存数据是否有可能不一致如何解决 8.1 Redis数据类型
类型特点示例String 字符串存储二进制任何类型数据最大512MB缓存计数共享SessionHash 字典 无序字典数组链表适合存对象 Key对应一个HashMap针对一组数据 存储、读取、修改用户属性List 列表双向链表有序增删快查询慢 消息队列文章列表 记录前N个最新登录的用户ID列表 Set 集合键值对无序唯一 支持交/并/差集操作 独立IP共同爱好标签 Sorted Set [Zset] 有序集合 键值对有序唯一自带按权重排序效果排行榜 Redis新的3种数据类型 Bitmaps位操作字符串 HyperLoglog Geographic 8.2 持久化RDB和AOF
RDB传统数据库中快照的思想。指定时间间隔将数据进行快照存储。
AOF传统数据库中日志的思想把每条改变数据集的命令追加到AOF文件末尾这样出问题了可以重新执行AOF文件中的命令来重建数据集。
对比RDBAOF备份量重量级的全量备份保存整个数据库轻量级增量备份一次只保存一个修改命令保存间隔时间保存间隔时间长保存间隔时间短默认1秒还原速度数据还原速度快数据还原速度慢阻塞情况save会阻塞但bgsave或者自动不会阻塞无论是平时还是AOD重写都不会阻塞数据体积同等数据体积小同等数据体积大安全性数据安全性低容易丢数据数据安全性高根据策略决定
8.3 淘汰与过期策略
淘汰作用范围机制名策略不淘汰noeviction禁止驱逐数据内存不足以容纳新入数据时新写入操作就会报错。系统默认的一种淘汰策略。设置了过期时间的键空间volatile-random随机移除某个keyvolatile-lru优先移除最近未使用的keyvolatile-ttlttl值小的key优先移除全键空间allkeys-random随机移除某个keyallkeys-lru优先移除最近未使用的key
8.4 Redis与Memcache对比
MemcacheRedis数据类型简单的Key-Value结构丰富的数据结构持久性不支持支持分布式存储客户端哈希分片/一致性哈希多种方式主从SentinelCluster等多线程支持支持Redis6.0开始支持内存管理私有内存池/内存池无事务支持不支持有限支持数据容灾不支持不能做数据恢复支持可以在做数据恢复
8.5 Redis分布式存储方案
分布式存储方案核心特点主从Master/Slave模式一主多从故障时手动切换哨兵Sentinel模式有哨兵的一主多从主节点故障自动选择新的主节点集群Cluster模式分节点对等集群,分slots不同slots的信息存储到不同节点 8.6 Redis集群切片方式
切片方式核心特点客户单分片在客户端通过key的hash值对应到不同的服务器中间件实现分片在应用软件和Redis中间例如Twemproxy、Codis等由中间件实现服务到后台Redis节点的路由分派客户端服务端协作分片客户端与服务端协作完成分片处理
8.7 Redis数据分片方案
方案分片方式说明范围分片按数据范围值来做分片例按用户编号分片0-999999映射到实例A1000000-1999999映射到实例B。哈希分片通过key进行hash运算分片可以把数据分配到不同实例,这类似于取余操作余数相同的放在一个实例上。一致性哈希分片哈希分片的改进利于扩展结点可以有效解决重新分配节点带来的无法命中问题。
8.8 Redis常见问题
缓存雪崩(Cache Avalanche)
大部分缓存失效造成数据库崩溃。
对于系统 A假设每天高峰期每秒 5000 个请求本来缓存在高峰期可以扛住每秒 4000 个请求但是缓存机器意外发生了全盘宕机。缓存挂了此时 1 秒 5000 个请求全部落数据库数据库必然扛不住它会报一下警然后就挂了。此时如果没有采用什么特别的方案来处理这个故障DBA 很着急重启数据库但是数据库立马又被新的流量给打死了。 缓存雪崩的事前事中事后的解决方案如下
事前Redis 高可用主从哨兵Redis cluster避免全盘崩溃。事中本地 ehcache 缓存 hystrix 限流降级避免 MySQL 被打死。事后Redis 持久化一旦重启自动从磁盘上加载数据快速恢复缓存数据。 答题答案 使用锁或队列保证不会有大量的线程对数据库一次性进行读写从而避免失效时大量的并发请求落到底层存储系统上。为key设置不同的缓存失效时间在固定的一个缓存时间的基础上 随机一个时间作为缓存失效时间。二级缓存设置一个有时间限制的缓存 一个无时间限制的缓存。避免大规模访问数据库。 缓存穿透(Cache Penetration)
查询无数据返回直接查数据库。
对于系统 A假设一秒 5000 个请求结果其中 4000 个请求是黑客发出的恶意攻击。
黑客发出的那 4000 个攻击缓存中查不到每次你去数据库里查也查不到。
举个栗子。数据库 id 是从 1 开始的结果黑客发过来的请求 id 全部都是负数。这样的话缓存中不会有请求每次都“视缓存于无物”直接查询数据库。这种恶意攻击场景的缓存穿透就会直接把数据库给打死。 答题答案 1.如果查询结果为空直接设置一个默认值存放到缓存这样第二次到缓冲中获取就有值了。设置一个不超过5分钟的过期时间以便能正常更新缓存。2.设置布隆过滤器将所有可能存在的数据哈希到一个足够大的bitmap中一个一定不存在的数据会被这个bitmap拦截掉从而避免了对底层存储系统的查询压力。 布隆过滤器用于快速识别一个元素不在一个集合中通过一个长二进制向量和一系列随机映射函数来记录与识别某个数据是否在一个集合中。 存击穿(Hotspot Invalid)
缓存击穿就是说某个 key 非常热点访问非常频繁处于集中式高并发访问的情况当这个 key 在失效的瞬间大量的请求就击穿了缓存直接请求数据库就像是在一道屏障上凿开了一个洞。
不同场景下的解决方式可如下
若缓存的数据是基本不会发生更新的则可尝试将该热点数据设置为永不过期。若缓存的数据更新不频繁且缓存刷新的整个流程耗时较少的情况下则可以采用基于 Redis、zookeeper 等分布式中间件的分布式互斥锁或者本地互斥锁以保证仅少量的请求能请求数据库并重新构建缓存其余线程则在锁释放后能访问到新缓存。若缓存的数据更新频繁或者在缓存刷新的流程耗时较长的情况下可以利用定时线程在缓存过期前主动地重新构建缓存或者延后缓存的过期时间以保证所有的请求能一直访问到对应的缓存。
缓存预热
系统上线后将相关需要缓存的数据直接加到缓存系统中。
解决
直接写个缓存刷新页面上线时手工操作。数据量不大时可以在项目启动的时候自动进行加载。定时刷新缓存。布隆过滤器用于快速识别一个元素不在一个集合中通过一个长二进制向量和一系列随机映射函数来记录与识别某个数据是否在一个集合中。
缓存更新
除Redis系统自带的缓存失效策略常见采用以下两种
定时清理过期的缓存。 当有用户请求过来时再判断这个请求所用到的缓存是否过期过期的话就去底层系统得到新数据并更新缓存。 缓存降级
降级的目的是保证核心服务可用即使是有损的而且有些服务是无法降级的如电商的购物流程等)。
在进行降级之前要对系统进行梳理从而梳理出哪些必须保护哪些可降级。 Redis相关资料 Redis概述与安装 https://blog.csdn.net/lili40342/article/details/127852124 Redis的5大数据类型 https://blog.csdn.net/lili40342/article/details/127897689 Redis的发布和订阅 https://blog.csdn.net/lili40342/article/details/127901009 Redis新的3种数据类型 https://blog.csdn.net/lili40342/article/details/127903901 Jedis操作Redis6 https://blog.csdn.net/lili40342/article/details/127904568 SpringBoot2整合Redis https://blog.csdn.net/lili40342/article/details/127915177 Redis事务操作 https://blog.csdn.net/lili40342/article/details/127915924 Redis持久化之RDB(Redis DataBase) https://blog.csdn.net/lili40342/article/details/127938199 Redis持久化之AOF(Append Only File) https://blog.csdn.net/lili40342/article/details/127938233 Redis主从复制 https://blog.csdn.net/lili40342/article/details/127942076 Redis哨兵(Sentinel) https://blog.csdn.net/lili40342/article/details/127942838 Redis集群(Cluster) https://blog.csdn.net/lili40342/article/details/127942123 Redis应用问题解决(缓存穿透、击穿、雪崩、分布式锁) https://blog.csdn.net/lili40342/article/details/127942407
9. 大数据 参考
https://blog.csdn.net/lili40342/article/details/128706099