SQL数据库不用SQL语句能显示全表的内容_数据库技术面经

本文为根据牛客网和笔者2019年面试经历总结的数据库知识面经。一般只有互联网公司中与数据库业务相关的部门或者银行IT相关部门问数据库的问题比较多。

1.什么是数据库事务?

答:数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。

2.数据库事务的特性?

答:

9896b799309b426000b3f713cf480de0.png

fa4822152a4ec307efd7890b2d6ffc53.png

3. 什么是脏读,幻读,不可重复读?

答:

脏读是读到其他事务未提交的数据;

不可重复读指在一个事务中前后读取数据不一致,即读到其他事务已提交的数据,针对update操作;

幻读是指在一个事务中前后读取的数据总量不一致,例如前后行数不同,针对insert操作。

4.事务的隔离级别和四级封锁协议?

答:事务是定义和维护一致性的单位,封锁就是要保证这种一致性。如果对封锁的要求高会增加开销,降低并发性和效率;有的事务并不严格要求结果的质量(如用于统计的事务),如果加上严格的封锁则是不必要和不经济的。因此有必要进行进一步的分析,考察不同级别的一致性对数据库数据的质量及并行能力的影响。

隔离级别:

30cf75c703fe04043929cacde5c1b658.png

c3ff8be36d55e64e8904d9e3cde6b625.png

四级封锁协议:

一级封锁协议:事务在对需要修改的数据上面(就是在发生修改的瞬间) 对其加共享锁(其他事务不能更改,但是可以读取-导致“脏读”),直到事务结束才释放。事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK)。

二级封锁协议是:1)事务 在对需要更新的数据 上(就是发生更新的瞬间) 加 排他锁 (直到事务结束) , 防止其他事务读取未提交的数据,这样,也就避免了 “脏读” 的情况。2)事务 对当前被读取的数据 上面加共享锁(当读到时加上共享锁),一旦读完该行,立即 释放该 该行的共享锁 - 从数据库的底层实现更深入的来理解,既是,数据库会对游标当前的数据上加共享锁 , 但是当游标离开当前行的时候,立即释放该行的共享锁。二级封锁协议除防止了“脏读”数据,但是不能避免 丢失更新,不可重复读,幻读 。

三级封锁协议是:二级封锁协议加上事务在读取数据的瞬间必须先对其加共享锁 ,但是直到事务结束才释放 ,这样保证了可重复读(既是其他的事务能读取该数据,但是不能更新该数据)。

四级封锁协议是对三级封锁协议的增强,其实现机制也最为简单,直接对事务中所读取或者 更改的数据所在的表加表锁,也就是说,其他事务不能读写该表中的任何数据。这样所有的 脏读,不可重复读,幻读 ,都得以避免!

6.什么是数据库索引?索引的优缺点?

答:

f83ff5fa72d5ac9f73e1f227bc5efa3f.png

索引虽然可以加快搜索速度,但是并不是越多越好。索引文件越大,占用的空间越多,由于索引底层大多是B+树等平衡多叉树,为了维护平衡,增删的时间效率很差。

7.索引的底层数据结构?各自的特点?

答:B树,B+树等。这两种都是平衡多叉树。B树的结点保存索引和关键字,B+树的非叶子结点保存索引,叶子节点保存关键字的有序链表。

f729a8aaf25cf558675e0d729ab72948.png

0a5219eeac0196e439228035aeed3544.png

4397cd676e4258531b3b58189cc96d64.png

8.Mysql 中的索引类型和区别?

答:

b4052c02ec4bd1a5cb57eb100c4bf5f5.png

9.什么是主键,外键?为什么要有主键?

答:

77768d205fc7542b12ba90cbe369fcbd.png

fab3d3c3f04094a90a91383e5ec7df4f.png

10.数据库范式

答:为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。

第一范式(确保每列保持原子性)

第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。

第二范式(确保表中的每列都和主键相关)

第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。

第三范式(确保每列都和主键列直接相关,而不是间接相关)

第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

比如Student表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话)

这样一个表结构,就存在上述关系。 学号--> 所在院校 --> (院校地址,院校电话)

这样的表结构,我们应该拆开来,如下:

(学号,姓名,年龄,性别,所在院校)--(所在院校,院校地址,院校电话)

11.什么是存储过程?

答:存储过程是一组为了完成特定功能的SQL语句集,只需编译一次,用户通过指定存储过程名字和参数来调用,示例如下:EXECUTE AddNewProduct( 'JTS01', 'Stuffed Eiffel Tower', 6.49, 'Plush stuffed toy with' ); 优点: 简单 安全 高性能 缺点:移植性差

12.数据库日志的类型和功能

答: 错误日志、查询日志、慢查询日志、事务日志、二进制日志、中继日志

错误日志:记录mysql实例运行中产生的错误或警告信息,以及每次mysql实例启动和停止的时间,必须开启;

查询日志:记录mysql运行的所有sql操作,无论成功与否;

慢查询日志:记录超过指定时间显示查询结果的sql命令,只会记录执行成功的语句;

二进制日志:记录的是除查询之外的所有命令;

中继日志:连接mastert和slave的信息,它是复制的核心,I/O线程将来自master的事件存储到中继日志中,中继日志充当缓冲,这样master不必等待slave执行完成就可以发送下一个事件;

事务日志:事务实际上是依靠事务日志实现的。存储引擎在修改表数据时,只需修改内存拷贝,再把修改行为记录到持久在硬盘上的事务日志中,日志持久化后,内存中修改的数据慢慢刷回磁盘。若在刷回磁盘前系统崩溃,可根据日志恢复。

13.innodb引擎和MyISAM引擎各自的特点和适应场景

答:
Innodb引擎提供了对数据库事务的支持,并且实现了SQL标准的四种隔离级别。该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于MySQL后台的完整数据库系统,MySQL运行时Innodb会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎不支持FULLTEXT类型的索引,而且它没有保存表的行数,当SELECT COUNT(*) FROM TABLE时需要扫描全表。当需要使用数据库事务时,该引擎当然是首选。由于锁的粒度更小,写操作不会锁定全表,所以在并发较高时,使用Innodb引擎会提升效率。但是使用行级锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表。
  MyIASM是MySQL默认的引擎,但是它没有提供对数据库事务的支持,也不支持行级锁和外键,因此当INSERT(插入)或UPDATE(更新)数据时即写操作需要锁定整个表,效率便会低一些。不过和Innodb不同,MyIASM中存储了表的行数,于是SELECT COUNT(*) FROM TABLE时只需要直接读取已经保存好的值而不需要进行全表扫描。如果表的读操作远远多于写操作且不需要数据库事务的支持,那么MyIASM也是很好的选择。

innodb提供了事务支持,外键支持和行级锁。

innodb更适合插入删除操作多的场景,myisam更适合查询操作更多的场景,MyISAM引擎 常用于读多写少的场景,不支持事务操作,提供表锁,不支持行级锁和外键,可以存储表的行数,一些操作不需要遍历全表,但是写操作会表锁,效率会低一些。但是表损坏后不能数据恢复。

14.什么是乐观锁,悲观锁?

答:

5a8a5c04492eee56375bf78bb6415a88.png

15.MVCC和乐观锁的区别

答:

0945c030a8b660fc8262404c7606e757.png

2b0706d0075689b8e34bf4bb06c704e9.png

MVCC只用来解决读写冲突,写写冲突是一级封锁协议解决的,而读读无冲突。

70fad626b26c8900965bd3c63554066b.png

f2b5ec89b08a089f9727fdec1f03597a.png

e440c036bbf7cda2ccd73e561ff8565c.png

16.什么是左连接,右连接,内连接

答:

932ea60b0d4890e59566382f219b4007.png

17.SQL语句的执行过程

答:数据库引擎检查语法,语义,对查询对象加锁,访问权限核对,确定最佳执行计划。

18. sql查询语句优化,索引优化?

答:sql解析出任务,引擎会对任务进行优化,比如如果当时引擎优化后觉得全表扫描更快,就不会走索引;数据库用直方图对数据的分布进行了统计,它能估计出来走哪个筛选效率更高;在表中建立索引,尽量在where group by字段建索引,尽量避免使用select * 而是使用具体字段,返回无用字段会降低查询效率。建立组合索引遵循最左前缀原则:

e27908a5a3e45117dfa098cbc5b16cb4.png

19.海量数据数据库分库分表

答:分表能够解决单表数据量过大带来的查询效率下降的问题,但是,却无法给数据库的并发处理能力带来质的提升。面对高并发的读写访问,当数据库master服务器无法承载写操作压力时,不管如何扩展slave服务器,此时都没有意义了。因此,我们必须换一种思路,对数据库进行拆分,从而提高数据库写入能力,这就是所谓的分库!与分表策略相似,分库可以采用通过一个关键字取模的方式,来对数据访问进行路由。

垂直切分和水平切分

89e5b29799996f838ce36b5321cd0ed3.png

原文链接:大数据高并发之-Mysql分表与分库使用场景以及设计方式_数据库_逍遥游的博客-CSDN博客

20.redis数据库的缓存一致性,缓存击穿,缓存雪崩,缓存并发

答:分布式环境下非常容易出现缓存和数据库间的数据一致性问题,针对这一点的话,只能说,如果你的项目对缓存的要求是强一致性的,那么请不要使用缓存。我们只能采取合适的策略来降低缓存和数据库间数据不一致的概率,而无法保证两者间的强一致性。合适的策略包括 合适的缓存更新策略,更新数据库后要及时更新缓存、缓存失败时增加重试机制,例如MQ模式的消息队列。

缓存击穿问题

缓存击穿表示恶意用户模拟请求很多缓存中不存在的数据,由于缓存中都没有,导致这些请求短时间内直接落在了数据库上,导致数据库异常。这个我们在实际项目就遇到了,有些抢购活动、秒杀活动的接口API被大量的恶意用户刷,导致短时间内数据库宕机了,好在数据库是多主多从的,hold住了。解决:布隆过滤器(推荐)

bloomfilter就类似于一个hash set,用于快速判某个元素是否存在于集合中,其典型的应用场景就是快速判断一个key是否存在于某容器,不存在就直接返回。

缓存雪崩问题

缓存在同一时间内大量键过期(失效),接着来的一大波请求瞬间都落在了数据库中导致连接异常。

解决方案:

1、也是像解决缓存穿透一样加锁排队,实现同上;

2、建立备份缓存,缓存A和缓存B,A设置超时时间,B不设值超时时间,先从A读缓存,A没有读B,并且更新A缓存和B缓存;

缓存并发问题

这里的并发指的是多个redis的client同时set key引起的并发问题。比较有效的解决方案就是把redis.set操作放在队列中使其串行化,必须的一个一个执行,具体的代码就不上了,当然加锁也是可以的。

原文链接:https://cloud.tencent.com/developer/news/243410

21.什么是非关系型数据库nosql(KV数据库:redis memcached,MongoDB)

答:Key-Value存储:(基于Redis)

传统的关系型数据库,处理一对多的问题,需要把外键放在多的一端,因为RDBMS理论中没有集合这个概念。而使用Redis,我们可以在一端来管理一对多的关系,使用Set(集合)。

如果使用MySQL,当数据规模非常大时,上面两个查询操作都需要借助表关联技术,而大表间的join在大型系统中是需要极力避免的操作。相反Redis的每个操作都会局限在一个较小的数据集范围内,而且key-value的存储形式,定位key只是一个复杂度为O(1)的操作。在very huge的数据量下,Redis性能效果非常优异,这就是NoSQL的优势所在!

22.redis数据持久化

答:

Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。有字符串,链表,集 合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。所以Redis也可以被看成是一个数据结构服务 器。Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个append only file(aof)里面(这称为“全持久化模式”)。 由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。redis提供两种方式进行持久化,一种是RDB持久化(原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化),另外一种是AOF(append only file)持久化(原理是将Reids的操作日志以追加的方式写入文件)。

4ba8290f795d3c32d3911531d264894d.png

原文链接:https://www.cnblogs.com/chenliangcl/p/7240350.html

23.Mysql和redis的区别

答:

4cbd4761d388ecdd87bf030dd25b98da.png

e583f4a6dcea5e6b513628c813abf15b.png

Mysql是关系型数据库(表格),redis是非关系型(K-V)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值