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

发布时间:2024年01月23日

说明:

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

?

1.听说过视图吗?那游标呢?

答案:

视图是一种虚拟的表,通常是有一个表或者多个表的行或列的子集,具有和物理表相同的功能。
?
游标是对查询出来的结果集作为一个单元来有效的处理。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。
?

2.MySQL中为什么要有事务回滚机制?

答案:

在 MySQL 中,恢复机制是通过回滚日志(undo log)实现的,所有事务进行的修改都会先记录到这个回滚日志中,然后在对数据库中的对应行进行写入。 当事务已经被提交之后,就无法再次回滚了。
?
回滚日志作用:
1)能够在发生错误或者用户执行 ROLLBACK 时提供回滚相关的信息
2) 在整个系统发生崩溃、数据库进程直接被杀死后,当用户再次启动数据库进程时,还能够立刻通过查询回滚日志将之前未完成的事务进行回滚,这也就需要回滚日志必须先于数据持久化到磁盘上,是我们需要先写日志后写数据库的主要原因。
?

3.数据库并发事务会带来哪些问题?

答案:

数据库并发会带来脏读、幻读、丢弃更改、不可重复读这四个常见问题,其中:
?
脏读:在第一个修改事务和读取事务进行的时候,读取事务读到的数据为100,这是修改之后的数据,但是之后该事务满足一致性等特性而做了回滚操作,那么读取事务得到的结果就是脏数据了。
?
幻读:一般是T1在某个范围内进行修改操作(增加或者删除),而T2读取该范围导致读到的数据是修改之间的了,强调范围。
?
丢弃修改:两个写事务T1 T2同时对A=0进行递增操作,结果T2覆盖T1,导致最终结果是1 而不是2,事务被覆盖。
?
不可重复读:T2 读取一个数据,然后T1 对该数据做了修改。如果 T2 再次读取这个数据,此时读取的结果和第一次读取的结果不同。
?

4.MySQL索引主要使用的两种数据结构是什么?

答案:
?
哈希索引,对于哈希索引来说,底层的数据结构肯定是哈希表,因此 在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引。
?
BTree 索引,Mysql的BTree索引使用的是B树中的B+Tree,BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从树的入口root开始,依次遍历node,获取leaf。
?
但对于主要的两种存储引擎(MyISAM和InnoDB)的实现方式是不同的。
?
?

5.数据库引擎InnoDBMyISAM的区别

答案:

InnoDB
  • 是 MySQL 默认的事务型存储引擎,只有在需要它不支持的特性时,才考虑使用其它存储引擎。
  • 实现了四个标准的隔离级别,默认级别是可重复读(REPEATABLE READ)。在可重复读隔离级别下,通过多版本并发控制(MVCC)+ 间隙锁(Next-Key Locking)防止幻影读。
  • 主索引是聚簇索引,在索引中保存了数据,从而避免直接读取磁盘,因此对查询性能有很大的提升。
  • 内部做了很多优化,包括从磁盘读取数据时采用的可预测性读、能够加快读操作并且自动创建的自适应哈希索引、能够加速插入操作的插入缓冲区等。
  • 支持真正的在线热备份。其它存储引擎不支持在线热备份,要获取一致性视图需要停止对所有表的写入,而在读写混合场景中,停止写入可能也意味着停止读取。
MyISAM
  • 设计简单,数据以紧密格式存储。对于只读数据,或者表比较小、可以容忍修复操作,则依然可以使用它。
  • 提供了大量的特性,包括压缩表、空间数据索引等。
  • 不支持事务。
  • 不支持行级锁,只能对整张表加锁,读取时会对需要读到的所有表加共享锁,写入时则对表加排它 锁。但在表有读取操作的同时,也可以往表中插入新的记录,这被称为并发插入(CONCURRENT INSERT)。

6.MySQL中有四种索引类型,可以简单说说吗?

答案:

FULLTEXT :即为全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER
TABLE ,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索
引。
?
HASH :由于HASH的唯一(几乎100%的唯一)及类似键值对的形式,很适合作为索引。 HASH索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,这种高效是有条件的,即只在“=”和“in”条件下高效,对于范围查询、排序及组合索引仍然效率不高。
?
BTREE :BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从树的入口root开始,依次遍历node,获取leaf。这是MySQL里默认和最常用的索引类型。
?
RTREE :RTREE在MySQL很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有
MyISAM、BDb、InnoDb、NDb、Archive几种。 相对于BTREE,RTREE的优势在于范围查找。
?
?

7.一道场景题:假如你所在的公司选择MySQL数据库作数据存储,一天五万条以上的增量,预计运维三年,你有哪些优化手段?

答案:

  • 设计良好的数据库结构,允许部分数据冗余,尽量避免join查询,提高效率。
  • 选择合适的表字段数据类型和存储引擎,适当的添加索引。
  • MySQL库主从读写分离。
  • 找规律分表,减少单表中的数据量提高查询速度。
  • 添加缓存机制,比如Memcached,Apc等。
  • 不经常改动的页面,生成静态页面。
  • 书写高效率的SQL。比如 SELECT * FROM TABEL 改为 SELECT field_1, field_2, field_3 FROM TABLE。

8.什么时候需要建立数据库索引呢?

答案:

在最频繁使用的、用以缩小查询范围的字段,需要排序的字段上建立索引。
不宜:
1)对于查询中很少涉及的列或者重复值比较多的列
2)对于一些特殊的数据类型,不宜建立索引,比如文本字段(text)等。
?

9.覆盖索引是什么?

答案:

覆盖索引是指一个索引包含或覆盖了查询语句中所需的所有字段的值,而无需进一步查找数据行。
简单来说,当一个查询只需要使用索引中的字段就能够返回所需的结果时,就称之为覆盖索引。
?
我们知道在InnoDB存储引 擎中,如果不是主键索引,叶子节点存储的是主键+列值。最终还是要“回表”,也就是要通过主键再查找一次,这样就 会比较慢。覆盖索引就是把要查询出的列和索引是对应的,不做回表操作!
?

10.数据库中的主键、超键、候选键、外键是什么?

答案:
?
超键:在关系中能唯一标识 元组的属性集称为关系模式的超键
候选键:不含有 多余属性的超键称为候选键。也就是在候选键中,若再删除属性,就不是键了!
主键用户选作元组标识的一个候选键程序主键
外键:如果关系模式 R 中属性 K 是其它模式的主键,那么 k 在模式 R 中称为外键
?
?

11.MySQL常见的存储引擎InnoDBMyISAM的区别?适用场景分别是?

答案:
?
1)事务:MyISAM不支持,InnoDB支持
2)锁级别: MyISAM 表级锁,InnoDB 行级锁及外键约束
3)MyISAM存储表的总行数;InnoDB不存储总行数;
4)MyISAM采用非聚集索引,B+树叶子存储指向数据文件的指针。InnoDB主键索引采用聚集索引,B+树叶子存储数据
?
适用场景
MyISAM适合: 插入不频繁,查询非常频繁,如果执行大量的SELECT,MyISAM是更好的选择, 没有事务。
InnoDB适合: 可靠性要求比较高,或者要求事务; 表更新和查询都相当的频繁, 大量的INSERT或UPDATE。
?

12.SQL中的NOW()CURRENT_DATE()两个函数有什么区别?

答案:

NOW()命令用于显示当前年份,月份,日期,小时,分钟和秒。
CURRENT_DATE()仅显示当前年份,月份和日期。
?

13.什么是聚合索引 ?什么是非聚合索引?

答案:

聚簇索引就是按照拼音查询,非聚簇索引就是按照偏旁等来进行查询。

其实,我们的汉语字典的正文本身就是一个聚集索引。比如,我们要查"安"字,就会很自然地翻开字典的前几页,因为"安"的拼音是"an",而按照拼音排序 汉字的字典是以英文字母"a"开头并以"z"结尾的,那么"安"字就自然地排在字典的前部。如果您翻完了所有以"a"开头的部分仍然找不到这个字,那么就说明您的字典中没有这个字;同样的,如果查"张"字,那您也会将您的字典翻到最后部分,因为"张"的拼音是"zhang"。也就是说,字典的正文部分本身 就是一个目录,您不需要再去查其他目录来找到您需要找的内容。
我们把这种 正文内容本身就是一种按照一定规则排列的目录称为 " 聚集索引 "
?
如果您认识某个字,您可以快速地从自动中查到这个字。但您也可能会遇到您不认识的字,不知道它的发音,这时候,您就不能按照刚才的方法找到您要查的字,而 需要去根据"偏旁部首"查到您要找的字,然后根据这个字后的页码直接翻到某页来找到您要找的字。但您结合"部首目录"和"检字表"而查到的字的排序并不是 真正的正文的排序方法,比如您查"张"字,我们可以看到在查部首之后的检字表中"张"的页码是672页,检字表中"张"的上面是"驰"字,但页码却是63 页,"张"的下面是"弩"字,页面是390页。很显然,这些字并不是真正的分别位于"张"字的上下方,现在您看到的连续的"驰、张、弩"三字实际上就是他 们在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。我们可以通过这种方式来找到您所需要的字,但它需要两个过程,先找到目录中的结果,然后 再翻到您所需要的页码。
我们把 这种目录纯粹是目录,正文纯粹是正文的排序方式称为 " 非聚集索引 "
?

14.MySQLCHARVARCHAR的区别有哪些?

答案:
  • char的长度是不可变的,用空格填充到指定长度大小,而varchar的长度是可变的。
  • char的存取数度还是要比varchar要快得多
  • char的存储方式是:对英文字符(ASCII)占用1个字节,对一个汉字占用两个字节。varchar的存储方式是:对每个英文字符占用2个字节,汉字也占用2个字节。

15.MySQL 索引使用的注意事项

答案:

MySQL 索引通常是被用于提高 WHERE 条件的数据行匹配时的搜索速度,在索引的使用过程中,存在一些使用细节和注意事项。
?
函数,运算,否定操作符,连接条件,多个单列索引,最左前缀原则,范围查询,不会包含有NULL值的列,like 语句不要在列上使用函数和进行运算。
?
应该注意以下问题:
1 )不要在列上使用函数,这将导致索引失效而进行全表扫描。
2 )尽量避免使用 != not in <> 等否定操作符
3 )多个单列索引并不是最佳选择
4 )复合索引的最左前缀原则
文章来源:https://blog.csdn.net/weixin_45257157/article/details/135741578
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。