当前位置: 主页 > 数据库

数据库常见面试题-软件测试常见面试题

发布时间:2023-02-08 10:12   浏览次数:次   作者:佚名

点击上方开始使用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的文件结构是:

软件测试常见面试题_android 常见面试题_数据库常见面试题

sql server的文件架构是:

软件测试常见面试题_数据库常见面试题_android 常见面试题

4.存储结构不同。

oracle存储结构:

在oracle中有两个block参数pctfree(fill factor)和pctused(reuse factor),可以控制block判断block本身什么时候有,什么时候没有足够的空间来接受新的信息(存储分析机制块)。 这减少了数据行连接和行迁移的可能性。 可以设置块大小(oltp 块和 dss 块)。

在oracle中,连续的block组成region,region可以动态分配(region的分布可以相等也可以自增),减少空间分配的次数。

在oracle中,一个表可以被分成多个段。 一个段由多个区域组成。 每个段都可以指定分配给哪个表空间(段的类型分为:数据段、索引段、回滚段、临时段、现金段)段。 表也​​可以在oracle中进行分区,它可以根据用户定义的业务规则、条件或规范在物理上分离磁盘上的数据。

这大大降低了磁盘争用的可能性。

Oracle 有七个基本表空间:

数据库常见面试题_软件测试常见面试题_android 常见面试题

不同的数据放在不同的表空间(数据字典和真实数据分开存放),oracle中的基表(存储系统参数信息)加密存储,任何人都无法访问。 只能通过用户可见视图查看。

SQL服务器存储结构:

以页为最小分配单元,每页8k(不可控,缺乏页存储解析机制),连续8个页组成一个'扩展',进一步减少分配资源的消耗。 (分配缺乏灵活性),数据在sql server中存储在表中,表存储在数据库中。

sql server 有五个基本数据库

android 常见面试题_软件测试常见面试题_数据库常见面试题

真实数据与数据字典一起存储。 系统参数信息没有安全机制。

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.姓名