测试测开——数据库高频面试题

测试测开——数据库高频面试题,第1张

测试/测开——数据库高频面试题 关系型数据库ACID

原子性:事务的 *** 作要么全部做完,要么都不做,一旦 *** 作失败,整个事务失败,需要回滚
一致性:数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。
隔离性:如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响
持久性:指一旦事务提交后,它所做的修改将会永久的保存在数据库上,不会丢失

数据库连接池:

数据库连接池的解决方案是在应用程序启动时建立足够的数据库连接,并讲这些连接组成一个连接池,由应用程序动态地对池中的连接进行申请、使用和释放

数据库执行流程:

1.TCP建立连接的三次握手 2.MySQL认证的三次握手 3.真正的SQL执行 4.MySQL的关闭 5.TCP的四次握手关闭
缺点:网络IO较多 数据库的负载较高 响应时间较长 应用频繁的创建连接和关闭连接,导致临时对象较多 在关闭连接后,会出现大量TIME_WAIT 的TCP状态
数据库连接池:第一次访问的时候,需要建立连接。 但是之后的访问,均会复用之前创建的连接,直接执行SQL语句。
优点:减少了网络开销 系统的性能会有一个实质的提升 没了麻烦的TIME_WAIT状态

数据库的类型:

关系型:Orcale、SQL serverI、BM DB2、Sybase
非关系型:Redis(键值型)、Hbase(列存储)、MongoDB(文档数据库)、new4j(图形数据库)

数据库分页:

客户端通过传递start(页码),limit(每页显示的条数)两个参数去分页查询数据库表中的数据

数据库的锁:

行锁:按照行的粒度对数据进行锁定。锁定力度小,发生锁冲突概率低,可以实现的并发度高,锁的开销比较大,容易出现死锁情况
页锁:按页的粒度进行锁定,会出现资源浪费的情况,开销介于行锁和表锁之间,并发度一般
表锁:锁定粒度很大,同时发生锁冲突的概率也会较高,数据访问的并发度低。对锁的开销小
乐观锁:认为对同一数据的并发 *** 作不会总发生,属于小概率事件,不用每次都对数据上锁,在表中设计一个版本字段 version,第一次读的时候,会获取 version 字段的取值。然后对数据进行更新或删除 *** 作时,会执行version=version+1。此时如果已经有事务对这条数据进行了更改,修改就不会成功。
悲观锁:对数据被其他事务的修改持保守态度,会通过数据库自身的锁机制来实现,从而保证数据 *** 作的排它性。

数据库三大范式:

第一范式:1NF,确保数据库表字段的原子性(一个key中只包含一个字段)
第二范式:2NF,满足第一范式,表必须有一个主键,非主键列必须完全依赖于主键
第三范式:满足第二范式,非主键列必须直接依赖于主键,不存在依赖传递,即非主键A依赖于非主键B,非主键B依赖于主键

数据库并发问题:

丢失更新:(回滚丢失)A事物撤销时,将B事物的更新给覆盖了。(覆盖丢失)A事物覆盖了B事物的更新
脏读:事物A读取到了事物B未提交的数据
幻读:事物A进行查询时,事物B进行插入或删除 *** 作,当事物A再次查询时,会产生幻行
不可重复读:事物A两次读取数据不同,在事物A读取期间,事物B修改了数据

数据库事务的四种隔离级别:

读未提交:所有事物都能看到其它事物未提交数据
读已提交:一个事物只能看到已提交事物做的改变,避免了脏读
可重复读:(默认隔离级别)确保同一事物多次并发读取时,可以得到同样数据,解决不可重复读数据
序列化(事务一个一个执行)强制事物排序,解决幻读问题

MySQL内连接,左连接,右连接:

内连接:连接表A表B,其中数据缺失的部分就舍去,只连接数据存在的部分,左连接,按表A连接,表B缺失的部分用NULL补齐,右连接(连接)按表B连接,表A缺失的数据用NULL补齐

索引的含义:

索引时存储引擎用于提高数据库表的访问结构的一种数据结构

索引的优缺点:

优点:加快数据检索速度,为用来排序或分组的字段添加索引,加快分组和排序的速度,加快表与表直接的连接
缺点:降低了数据库增删改的效率,同时也增加了数据库的尺寸大小

哪些情况适合创建索引:

主键,外键,频繁查询,排序,统计和分组的字段

哪些情况不适合创建索引:

where中用不到的字段,表记录较少,需要经常增删改的表,参与列计算的列,区分度不高的字段

索引的数据结构:

包括B+树和哈希表
B+树索引:B+树是基于B树和叶子节点顺序访问指针实现的,它具有B树的平衡性,并且通过顺序指针提高取件查询的性能
哈希索引:基于哈希表实现的,对每一行数据,存储引擎会对索引列进行哈希计算得到哈希码,将哈希码的值作为哈希表的key,指向数据行的指针作为value,多用于精确查找
哈希索引和B+树索引的区别
哈希索引不支持排序,不支持范围查找,不支持模糊查询以及多列索引的最左前缀匹配,哈希表中会存在哈希冲突,性能不稳定,B+树索引是稳定的,每次查询都是从根到叶子节点
为什么B+树更适合数据库索引
B+树的数据都存在叶子节点中,叶子节点均为索引,方便扫库,只需要扫描叶子节点即可,B树由于分支节点同样存储数据,要找具体数据则需要中序遍历,所以B+树更适合区间查询的情况,而在数据库中区间查询的情况很普遍
B+树的节点只存key,具体数据在叶子节点中,这使得以页为单位的索引中可以存放更多节点,检索I/O支出
B+树查询效率稳定,所有关键字的查询路径相同,导致灭个数据的查询效率相当

索引分类

主键索引,唯一索引;组合索引;全文索引:

Exist和in 的区别

Exist用于对外表记录做筛选,会遍历外表,将外查询表的每一行,代入内查询进行判断,当exist里的条件语句能够返回记录行时,条件为真,返回外表记录,反之如果exist里的条件语句不能返回记录,条件为假,外表记录被丢弃
In 是先把后面的语句查出来放到临时表中,然后遍历临时表,将临时表的每一行带入外查询去查找
外表大用in,内表大用exist

Having和where的区别

作用对象不同,where作用于表和视图,having作用于组
Where在分组前过滤,having在数据分组后过滤

Truncate、delete、drop的区别

相同点:truncat和不带where子语句的delete、以及drop都会删除表内的数据,drop,truncate都是DDL语句,执行后自动提交
不同点:truncate删除表中全部数据,delete可以删除部分数据,也可以删除全部数据,不删除结构,drop删除表结构与所有数据,delete可以回滚,truncate和drop不能,drop和truncata会释放空间,delete不会,执行速度:drop>truncate>delete

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5685764.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存