嵌入式软件工程师面试题——2025校招社招通用(数据库篇)(三十三)

发布时间:2024年01月23日

说明:

  • 面试群,群号: 228447240
  • 面试题来源于网络书籍,公司题目以及博主原创或修改(题目大部分来源于各种公司);
  • 文中很多题目,或许大家直接编译器写完,1分钟就出结果了。但在这里博主希望每一个题目,大家都要经过认真思考,答案不重要,重要的是通过题目理解所考知识点,好应对题目更多的变化;
  • 博主与大家一起学习,一起刷题,共同进步;
  • 写文不易,麻烦给个三连!!!

1.关系型和非关系型数据库的区别你了解多少?

答案:

关系型数据库的优点
  • 容易理解。因为它采用了关系模型来组织数据。
  • 可以保持数据的一致性。
  • 数据更新的开销比较小。
  • 支持复杂查询(带where子句的查询)
非关系型数据库的优点
  • 不需要经过SQL层的解析,读写效率高。
  • 基于键值对,数据的扩展性很好。
  • 可以支持多种类型数据的存储,如图片,文档等等。

2.什么是非关系型数据库?

答案:

非关系型数据库也叫 NOSQL ,采用键值对的形式进行存储。
它的读写性能很高,易于扩展,可分为内存性数据库以及文档型数据库,比如 Redis Mongodb HBase等等。
适合使用非关系型数据库的场景:
  • 日志系统
  • 地理位置存储
  • 数据量巨大
  • 高可用

3.存储过程和函数的区别

答案:

存储过程是用户定义的一系列sql语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表。

4.事务是什么?

答案:

事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为?ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能称为一个事务:

原子性

事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。

一致性

事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如?B 树索引或双向链表)都必须是正确的。

隔离性

由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。

持久性

事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。

5.游标的作用?如何知道游标已经到了最后?

答案:

游标用于定位结果集的行,通过判断全局变量@@FETCH_STATUS可以判断是否到了最后,通常此变量不等于0表示出错或到了最后。

6.触发器分为事前触发和事后触发,这两种触发有何区别。语句级触发和行级触发有何区别。

答案:

事前触发器运行于触发事件发生之前,而事后触发器运行于触发事件发生之后。通常事前触发器可以获取事件之前和新的字段值。

语句级触发器可以在语句执行前或后执行,而行级触发在触发器所影响的每一行触发一次。

7.对数据库的一张表进行操作,同时要对另一张表进行操作,如何实现?

答案:

将操作多个表的操作放入到事务中进行处理。

8.触发器怎么工作的?

答案:

触发器主要是通过事件进行触发而被执行的,当对某一表进行诸如UPDATE、 INSERT、 DELETE 这些操作时,数据库就会自动执行触发器所定义的SQL 语句,从而确保对数据的处理必须符合由这些SQL 语句所定义的规则。

9.为什么使用索引?

答案:

  • 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
  • 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
  • 帮助服务器避免排序和临时表
  • 将随机IO变为顺序IO
  • 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

10.Innodb为什么要用自增id作为主键?

答案:

如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。
如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置, 频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE optimize table )来重建表并优化填充页面。

11.你了解MySQL的内部构造吗?一般可以分为哪两个部分?

答案:

可以分为服务层存储引擎层两部分,其中:
服务层包括连接器、查询缓存、分析器、优化器、执行器等 ,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
存储引擎层负责数据的存储和提取 。其架构模式是插件式的,支持 InnoDB MyISAM Memory 等多个存储引擎。现在最常用的存储引擎是InnoDB ,它从 MySQL 5.5.5 版本开始成为了默认的存储引擎。

12.说一说DropDeleteTruncate的共同点和区别

答案:

  • Delete用来删除表的全部或者一部分数据行,执行delete之后,用户需要提交(commmit)或者回滚(rollback)来执行删除或者撤销删除,会触发这个表上所有的delete触发器。
  • Truncate删除表中的所有数据,这个操作不能回滚,也不会触发这个表上的触发器,TRUNCATE比delete更快,占用的空间更小。
  • Drop命令从数据库中删除表,所有的数据行,索引和权限也会被删除,所有的DML触发器也不会被触发,这个命令也不能回滚。

总结:

????????1.Drop直接删掉表;

????????2.Truncate删除表中数据,再插入时自增长id又从1开始 ;

????????3.Delete删除表中数据,可以加where字句。

13.MySQL优化了解吗?说一下从哪些方面可以做到性能优化?

答案:

  • 为搜索字段创建索引
  • 避免使用 Select *,列出需要查询的字段
  • 垂直分割分表
  • 选择正确的存储引擎

14.数据库隔离级别

答案:

未提交读 ,事务中发生了修改,即使没有提交,其他事务也是可见的,比如对于一个数 A 原来 50 修改为100 ,但是我还没有提交修改,另一个事务看到这个修改,而这个时候原事务发生了回滚,这时候A还是 50 ,但是另一个事务看到的 A 100. 可能会导致脏读、幻读或不可重复读。
提交读 ,对于一个事务从开始直到提交之前,所做的任何修改是其他事务不可见的,举例就是对于一个数A 原来是 50 ,然后提交修改成 100 ,这个时候另一个事务在 A 提交修改之前,读取的 A 50 ,刚读取完,A 就被修改成 100 ,这个时候另一个事务再进行读取发现 A 就突然变成 100 了; 可以阻止脏读, 但是幻读或不可重复读仍有可能发生。
重复读 ,就是对一个记录读取多次的记录是相同的,比如对于一个数 A 读取的话一直是 A ,前后两次读取的A 是一致的; 可以阻止脏读和不可重复读,但幻读仍有可能发生。
可串行化读 ,在并发情况下,和串行化的读取的结果是一致的,没有什么不同,比如不会发生脏读和幻读;该级别可以防止脏读、不可重复读以及幻读。

15.都知道数据库索引采用B+树而不是B树,原因也有很多,主要原因是什么?

答案:

主要原因: B+ 树只要遍历叶子节点就可以实现整棵树的遍历,而且在数据库中基于范围的查询是非常频繁的,而B 树只能中序遍历所有节点,效率太低。
文章来源:https://blog.csdn.net/weixin_45257157/article/details/135740005
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。