数据库常见面试题-软件测试常见面试题
点击上方开始使用SQL数据库,选择设为星标回复“我要视频”免费获取视频数据面试官常见数据库问题11-21
11.Oracle和SQL Server有什么区别?
12.关系型数据库和非关系型数据库的区别和优势是什么?
13、MYSQL两种存储引擎的区别(事务、锁级别等),以及各自适用的场景
14.MongoDB和Redis的区别
15.Memcached和redis的区别
16.项目中缓存用在什么地方
17. Redis如何持久化
18、Redis的内存淘汰策略有哪些?
19.redis有哪些数据类型
20.Redis一般用在那些场景
21.SQL题目
11.Oracle和SQL Server有什么区别?
oracle:可以在不同的平台上运行(ISO标准认证); 支持PL-SQL脚本语言; 高性能;
sqlserver:只能运行在windows平台; 支持T-SQL脚本语言; 多用户性能低;
区别:
1.最大的区别是平台。 oracle可以运行在不同的平台上; sqlserver只能运行在windows平台上。 windows平台的稳定性和安全性影响到sqlserver的稳定性和安全性。
2、oracle使用的脚本语言是PL-SQL,而sqlserver使用的脚本是T-SQL。
文体结构不同
3.架构不同。
oracle的文件结构是:
sql server的文件架构是:
4.存储结构不同。
oracle存储结构:
在oracle中有两个block参数pctfree(fill factor)和pctused(reuse factor),可以控制block判断block本身什么时候有,什么时候没有足够的空间来接受新的信息(存储分析机制块)。 这减少了数据行连接和行迁移的可能性。 可以设置块大小(oltp 块和 dss 块)。
在oracle中,连续的block组成region,region可以动态分配(region的分布可以相等也可以自增),减少空间分配的次数。
在oracle中,一个表可以被分成多个段。 一个段由多个区域组成。 每个段都可以指定分配给哪个表空间(段的类型分为:数据段、索引段、回滚段、临时段、现金段)段。 表也可以在oracle中进行分区,它可以根据用户定义的业务规则、条件或规范在物理上分离磁盘上的数据。
这大大降低了磁盘争用的可能性。
Oracle 有七个基本表空间:
不同的数据放在不同的表空间(数据字典和真实数据分开存放),oracle中的基表(存储系统参数信息)加密存储,任何人都无法访问。 只能通过用户可见视图查看。
SQL服务器存储结构:
以页为最小分配单元,每页8k(不可控,缺乏页存储解析机制),连续8个页组成一个'扩展',进一步减少分配资源的消耗。 (分配缺乏灵活性),数据在sql server中存储在表中,表存储在数据库中。
sql server 有五个基本数据库
真实数据与数据字典一起存储。 系统参数信息没有安全机制。
12.关系型数据库和非关系型数据库的区别和优势是什么?
关系型数据库:可以使用SQL语句在多张表之间进行非常复杂的数据查询; 安全性高; 数据存储在硬盘上;
非关系型数据库:高性能; 可扩展(水平扩展); 数据存储在缓存中,比关系型数据库查询速度更快;
非关系数据库的优点:
性能:NOSQL是基于键值对的,可以想象成表中主键和值的对应关系,不需要SQL层解析,所以性能非常高。
可扩展性:也因为基于键值对的数据之间没有耦合,所以很容易水平扩展。
关系数据库的优点:
复杂查询:SQL语句可以用来在一张表和多张表之间进行非常复杂的数据查询。
事务支持:能够实现具有高安全性能的数据访问需求。
13、MYSQL两种存储引擎的区别(事务、锁级别等),以及各自适用的场景
MySql主要有两个存储引擎:InnoDB和MyISAM。
InnoDB:支持事务、外键; 支持行级锁; 聚集索引; 不保存行数; 不支持全文类型索引(查找全表行数时,不需要全表扫描);
MyISAM:不支持事务、外键; 支持表级锁(低性能); 非聚集索引; 保存行数; 支持全文类型索引(查找表总行数时全表扫描);
使用场景:InnoDB一般是默认的。 当表比较小,读操作多,插入更新少的时候,可以考虑用MyIsam代替事务。
区别
InnoDB支持事务,后者不支持
InnoDB 支持外键,MyIsam 不支持
InnoDB支持行级锁,MyIsam是表级锁,表级锁性能低
InnoDB是聚集索引,即索引中键值的逻辑顺序决定了表中对应行的物理顺序,而MyIsam是非聚集索引,即索引的逻辑顺序索引中的索引不同于行在磁盘上的物理存储顺序。
InnoDB 不保存行数,后者保存。
使用场景一般默认是InnoDB。 如果表比较小,读操作多,插入更新操作少,不需要考虑事务,可以考虑MyIsam
14.MongoDB和Redis的区别
①. 性能方面:redis比mongodb大;
②. 操作方便:Mongodb支持丰富的数据表达和索引,最类似于关系型数据库,支持非常丰富的查询语言; Redis 具有丰富的数据结构
③. 内存空间大小和数据量大小:Mongodb适合存储大量数据;
④. 数据一致性:Redis事务支持比较弱; Mongodb 不支持事务;
⑤. 应用场景:Redis用于小数据量的运算和计算; MongoDB主要解决海量数据的访问效率问题。
redis、memcache、mongoDB对比
从以下维度对redis、memcache、mongoDB进行对比,欢迎拍砖
1.性能
都比较高,性能应该不是我们的瓶颈。
总的来说redis在TPS上和memcache差不多,比mongodb大
2、操作方便
Memcache数据结构单一
Redis更丰富,在数据操作方面,redis更好,网络IO次数更少
mongodb支持丰富的数据表达,索引,最类似于关系型数据库,支持非常丰富的查询语言
3.内存空间的大小和数据量的大小
Redis在2.0版本后加入了自己的VM特性,突破了物理内存的限制; 您可以为键值设置一个过期时间(类似于memcache)
Memcache可以修改最大可用内存,使用LRU算法
MongoDB 适合存储大量数据。 它依赖于操作系统 VM 进行内存管理,并且会消耗更多的内存。 该服务不应与其他服务结合使用。
4.可用性(单点问题)
对于单点问题
Redis依赖客户端实现分布式读写; 主从复制时,每次从节点重新连接到主节点,都必须依赖整个快照,没有增量复制,由于性能和效率问题,
因此,单点问题比较复杂; 不支持自动分片,需要依赖程序设置一致的哈希机制。
另一种方法是自己使用主动复制(多副本存储)代替redis本身的复制机制,或者改成增量复制(需要自己实现),一致性问题和性能之间的权衡
Memcache本身没有数据冗余机制,也没有必要; 在故障预防方面,采用成熟的hash或ring算法解决单点故障带来的抖动问题。
mongoDB支持master-slave,replicaset(内部使用paxos选举算法,故障自动恢复),auto sharding机制,为客户端屏蔽了failover和segmentation机制。
5.可靠性(持久性)
用于数据持久化和数据恢复
Redis支持(快照、AOF):依赖快照持久化,aof增强可靠性的同时,对性能有影响
Memcache不支持,一般用于缓存提高性能;
MongoDB从1.8版本开始采用binlog的方式来支持持久化的可靠性
6.数据一致性(事务支持)
Memcache 使用cas 保证并发场景下的一致性
Redis事务支持比较弱,只能保证事务中的每一个操作的持续执行
mongoDB 不支持事务
七、数据分析
mongoDB内置数据分析功能(mapreduce),其他不支持
八、应用场景
redis:性能更高的操作和数据量更小的操作
memcache:用于在动态系统中减少数据库负载和提高性能; 做缓存,提高性能(适合读多写少,数据量大,可以使用sharding)
MongoDB:主要解决海量数据的访问效率问题
15.Memcached和redis的区别
①. 存储方式:Memcached数据在内存中,断电挂掉,数据不能超过内存大小; Redis部分存储在硬盘上,保证数据持久化;
②.数据支持类型:Memcached支持的数据类型比较简单; Redis 具有复杂的数据类型;
③.Value大小:Redis最大可达1G; Memcached 只有 1MB。
16.项目中缓存用在什么地方
缓存数据(查询删除多变化少的数据)如:数据字典(变化少,基本不变化)
为什么要使用缓存?
缓存的目的主要有两个,高性能和高并发。
高并发场景不常见,所以项目为了高性能使用它。
如果读取大量数据,可以放入缓存,读取时直接通过key从缓存中找到值,可以大大提高性能。
使用缓存有什么问题?
①缓存雪崩。
②缓存穿透。
③缓存和数据量双写不一致。
④缓存并发竞争。
17. Redis如何持久化
持久化:将内存中的数据写入硬盘。
Redis实现数据持久化的两种实现方式: 1、RDB实现Redis数据持久化(默认方式); 2、AOF持久化方案;
RDB:按指定时间间隔保存数据快照;
AOF:首先将命令追加到操作日志的末尾,保存所有历史操作;
RDB:将数据写入临时文件(dump.rdb)。 持久化结束后,用这个临时文件替换上次持久化的文件,实现数据恢复。
持久化是按时间间隔执行的。 如果redis在持久化之间失败,就会出现数据丢失的情况,所以这种方式比较适用于对数据要求不严格的时候。
默认启用AOF:记录执行过的指令,恢复数据时按照从前到后的顺序执行指令,实现数据恢复。
AOF相比RDB的优势:可以保证数据完整性,可以处理历史操作;
但是AOF文件比RDB文件大,恢复速度慢,所以默认关闭。
18、Redis的内存淘汰策略有哪些?
①.noeviction:默认策略是不删除任何数据,但是当内存不足时,会直接返回错误
②.Allkeys-lru:从数据集中(包括设置过期时间和未设置过期时间的数据集),优先移除最近未使用的key
③.volatile-lru:在设置了过期时间的数据集中,最近没有使用的key优先移除
④.Allkeys-random:从数据集中随机取出一个key(包括设置过期时间和未设置过期时间的数据集)
⑤. volatile-random:从设置了过期时间的数据集中随机删除一个key。 volatile-ttl:在设置了过期时间的数据集中,先删除过期时间较早的key。
Redis内存淘汰:用户存储的一些key会被redis主动从实例中删除,导致read miss。
内存淘汰是为了更好的利用内存,一定的cache miss是为了换取内存的使用。
Redis提供的内存淘汰策略有:
①.noeviction:默认策略是不删除任何数据,但是当内存不足时,会直接返回错误
②.Allkeys-lru:从数据集中(包括设置过期时间和未设置过期时间的数据集),优先移除最近未使用的key
③.volatile-lru:在设置了过期时间的数据集中,最近没有使用的key优先移除
④.Allkeys-random:从数据集中随机取出一个key(包括设置过期时间和未设置过期时间的数据集)
⑤. volatile-random:从设置了过期时间的数据集中随机删除一个key。 volatile-ttl:在设置了过期时间的数据集中,先删除过期时间较早的key。
redis的雪崩与渗透
缓存穿透
什么是缓存穿透?
一般的缓存系统是根据键(key)来缓存查询的。 如果没有对应的值(value),就去DB(数据库)中查找。
这时候如果并发请求量很大,会给后端DB系统带来很大的压力。 这叫做缓存穿透!
成因:
业务本身的代码或数据有问题;
一些恶意攻击和爬虫造成大量的空命中,此时会给数据库造成很大的压力。
解决方案:
设置布隆过滤器,将所有可能的数据散列成一个足够大的位图,一个一定不存在的数据会被这个位图拦截。
避免了底层存储系统的查询压力。
如果一个查询返回的数据为空,无论数据不存在还是系统故障,我们仍然缓存结果,但是它的过期时间会很短
不超过 5 分钟。
服务雪崩
什么是雪崩?
因为缓存层承载了大量的请求,有效的保护了存储层。 但是,如果缓存由于某些原因无法整体提供服务数据库常见面试题,所有的请求都会到达存储层,对存储层的调用会急剧增加,导致存储层挂掉。
缓存雪崩的英文解释是a running bison,意思是缓存层宕机后,并发流量会像奔腾的野牛一样,存储大量的后端存储。
成因:
当缓存服务器重启或者一定时间内大量缓存失效时,大量数据在失效时会直接访问DB,给DB带来很大的压力。
解决方案:
设置redis集群和DB集群的高可用。 如果redis宕机了,可以马上换成其他机器。 这样可以防止一部分风险。
使用互斥体
缓存过期后,通过加锁或队列来控制读写数据库的线程数。 例如:只允许一个线程查询某个key的数据和写缓存,其他线程等待。 对于单机,可以使用synchronized或者lock来解决。 如果是分布式环境,可以使用redis setnx命令解决。
对于不同的key,可以设置不同的过期时间,使缓存失效时间点不一致,尽量做到均匀分布。
永不过期
redis中设置永不过期,这样保证不会出现热点,也就是物理上不会过期。
资源保护
使用netflix的hystrix,可以隔离各种资源的线程池,保护主线程池。
19.redis有哪些数据类型
String(字符串)、Hash(散列)、List(列表)、Sets(集合)、ZSet(有序集合)
①.String(字符串):redis最基本的数据类型,一个key对应一个value,一个key最多可以存储512MB
②.Hash(散列):是键值对的集合,特别适用于存储对象
③.List(列表):存储多个字符串值,可以重复,按插入顺序排序,或者在列表的头尾添加一个元素
④.Sets(集合):存储多个值,不能重复,无顺序
⑤. ZSet(ordered set):存储多个值,不能重复,有顺序。不同的是每个元素都会关联一个double类型的score,redis通过score对集合中的成员从小到大进行排序
20.Redis一般用在那些场景
①. 缓存热数据(热数据:删除多修改少的查询数据)
②. 计数器,如统计点击次数等应用
③.队列
④.位运算(大数据处理),如在线人数统计
⑤. 分布式锁和单线程机制
⑥. 最新名单
⑦. 排行榜,使用zadd添加有序集合
Redis使用场景:会话缓存(Session Cache)、全页缓存(FPC)、排行榜/计数器
redis的优点:
速度快,因为数据是存储在内存中的,类似于HashMap,HashMap的优点是查找和运算的时间复杂度是O(1)
支持丰富的数据类型,支持string、list、set、sorted set、hash
支持事务,并且操作是原子的。 所谓原子性,就是对数据的所有改动要么执行要么根本不执行。
丰富的功能:可用于缓存,消息,key设置过期时间数据库常见面试题,过期自动删除
21.SQL题目
在GRADE表中查找80-90个学号和分数
select 学号,分数 from grade where 分数 between 80 and 90
在 GRADE 表中查找课程编号为 003 的学生的平均成绩
select avg(分数) from grade where 课程编号='003'
查询GRADE表中每门课程的学习人数
select 课程编号,count(学号) as 人数 from grade group by 课程编号
查询所有张姓学生的学号和姓名
select 姓名,学号 from student_info where 姓名 like'张%'
查询与学号为'0001'的学生同性别的所有学生的姓名和出生日期
select 姓名,出生年月 from student_info where 性别 in(select 性别 from student_info where sno='0001')
查询课程号为0002和0003的所有学生的学号、姓名、性别
select 学号,姓名,性别 from student_infowhere 学号 in(select 学号 from grade where 课程编号='0002' and 学号 in(select 学号 from grade where 课程编号='0001'))
查询学号0001的分数高于学号0002最低分的课程号的课程号和分数
select 课程编号, 分数 from grade where 学号='0001'and 分数>(select min(分数) from grade where 学号='0002')
查询80~90分学生的学号、姓名、成绩
select student_info.学号,student_info.姓名,grade.分数 from student_info,grade where grade.分数 between 80 and 90
查询学习过《C语言》课程的学生学号、姓名、成绩
select student_info.学号,student_info.姓名,grade.成绩 from student_info,grade,curriculum where student_info.学号=grade.学号 and grade.课程号=curriculum.课程号 and curriculum.课程名='C 语言'
查询所有学生的总成绩。 要求列出学号、姓名和总成绩。 未选课学生的总成绩为空。
select grade.学号,student_info.姓名,sum(grade.成绩) as 总成绩 from student_info,grade where grade.学号=student_info.学号 group by grade.学号,student_info.姓名