1.为什么 group by 和 order by 会使查询变慢

group by 和 order by 操作通常需要创建一个临时表来处理查询的结果,所以如果查询结果很多的
话会严重影响性能。

2.delete、 truncate 和 drop 的区别

Delete 命令用来删除表的全部或者一部分数据行,执行 delete 之后,用户需要提交(commmit)或者回滚(rollback) transaction 来执行删除或者撤销删除, delete 命令会触发这个表上所有的 delete 触发器。

Truncate 删除表中的所有数据,这个操作不能回滚,也不会触发这个表上的触发器, truncate 比 delete更快,占用的空间更小。

Drop 命令从数据库中删除表,所有的数据行,索引和权限也会被删除,所有的 DML 触发器也不会被触发,这个命令也不能回滚

3.简述数据库的设计过程

数据库设计分为以下五个阶段:
1)需求分析:主要是准确收集用户信息需求和处理需求,并对收集的结果进行整理和分析,形成需求说明。
2)概念结构设计:对用户需求进行综合、归纳、抽象,形成一个与与具体的 DBMS 无关概念模型(一般为 ER 模型)。
3)逻辑结构设计:将概念结构设计的概念模型转化为某个特定的 DBMS 所支持的数据模型,建立数据库逻辑模式,并对其进行优化,同时为各种用户和应用设计外模式。
4)物理结构设计:为设计好的逻辑模型选择物理结构,包括存储结构和存取方法等,建立数据库物理模式。
5)实施和维护:实施就是使用 DLL 语言建立数据库模式,将实际数据载入数据库,建立真正的数据库。维护阶段是对运行中的数据库进行评价、调整和修改。

4.插入记录时可以不指定字段名称吗?

不管使用哪种 INSERT 语法,都必须给出 VALUES 的正确数目。如果不提供字段名,则必须给
每个字段提供一个值,否则将产生一条错误消息。如果要在 INSERT 操作中省略某些字段,这些字段需要满足一定条件:该列定义为允许空值;或者表定义时给出默认值,如果不给出值,将使用默认值。

MySQL中, INSERT 语句用来向数据表中插入数据。可以一次性插入一条或多条数据。

语法:

SQL中通过 INSERT INTO 命令向数据表中插入数据。下面是通用语法:

INSERT INTO table_name ( field1, field2,...fieldN )

VALUES( value1, value2,...valueN );

字段名是可选项。如果只插入部分字段的值,则必须指定字段名。

5.本地索引与全局索引的差别与适用情况

对于本地索引,每一个表分区对应一个索引分区,当表的分区发生变化时,索引的维护由数据库
自动进行。对于全局索引,可以选择是否分区,而且索引的分区可以不与表分区相对应。当对分区进行维护操作时,通常会导致全局索引的 INVALDED,必须在执行完操作后 REBUILD。

6.事务和锁有什么关系?

可以使用多种机制来确保数据的完整性,例如约束、触发器以及本章介绍的事务和锁等。事务和
锁的关系非常紧密。

事务包含一系列的操作,这些操作要么全部成功,要么全部失败,通过事务机制管理多个事务,保证事务的一致性,事务中使用锁保护指定的资源,防止其他用户修改另外一个还没有完成的事务中的数据。

7.谈谈你对索引的理解

索引是若干数据行的关键字的列表,查询数据时,通过索引中的关键字可以快速定位到要访问的
记录所在的数据块,从而大大减少读取数据块的 I/O 次数,因此可以显著提高性能

8.谈谈你对事务的理解?

事务从 COMMIT、 ROLLBACK、连接到数据库或开始第一条可执行的 SQL 语句时开始,到一条
COMMIT、 ROLLBACK 语句或退出数据库时结束。如果在一个事务中包含 DDL 语句,则在 DDL 语句的前后都会隐含地执行 COMMIT 语句,从而开始或结束一个事务。如果一个事务由于某些故障或者由于用户改变主意而必须在提交前取消它,则数据库被恢复到这些语句和过程执行之前的状态。利用 ROLLBACK语句可以在 COMMIT 命令前随时撤消或回退一个事务。可以回退整个事务,也可以会退部分事务,但是不能回退一个已经被提交的事务。回退部分事务的 ROLLBACK 命令为: ROLLBACK to savepoint 存储点名,存储点是用户放入事务中的标记,用来表示一个可被回退的位置。存储点通过在事务中放入一个SAVEPOINT 命令而被插入。该命令的语法是: SAVEPOINT 存储点名,如果在 ROLLBACK 语句中没有给出存储点名,则整个事务被回退。

9.你对游标的理解,游标的分类

游标是结果集数据中的指针, 作用是为遍历结果集时, 存储每条记录的结果。游标分为显式游标
和隐式游标

10.触发器中能否用 COMMIT, 为什么

在触发器中不能使用 COMMIT 等事务控制语句。因为触发器是事务触发的如果有事务控制语句
就会影响到触发它的事务。即连带触发它的语句之前的已经完成的没有提交的语句都要受到影响。这是会影响到数据的一致性的

11.如何设置网络数据包的大小

一般情况下,设置网络数据包的大小可参考以下方法。如果应用程序常执行大容量复制操作或者
是发送、接收大量的 text 和 image 数据的话,可以将此值设大一点。如果应用程序接收和发送的信息量都很小,那么可以将其设为 512 字节

12.归档模式与非归档模式?为什么归档模式可以恢复到任意时刻

归档是在重做日志文件被覆盖之前,将该重做日志文件通过复制操作系统文件的方式,保存到指
定的位置。保存下来的重做日志文件的集合被称为归档重做日志文件,复制的过程被称为归档。
在归档日志(ARCHIVELOG)模式下, 数据库对重做日志文件进行归档操作。非归档日志
(NOARCHIVELOG)模式下,不会对重做日志文件进行归档操作。由于非归档模式不会在覆盖之前保存,这样就造成了数据库在一定时间之前的重做日志文件丢失,也就不能恢复到被覆盖之前。而归档模式在任意时间上都有重做日志文件,故可以恢复到任意时刻。

13.如何提高日志的切换频率?
 通过参数 ARCHIVE_LAG_TARGET 可以控制日志切换的时间间隔,以秒为单位。通过减少时间
间隔,从而实现提高日志的切换频率。例如以下代码:
SQL> ALTER SYSTEM SET ARCHIVE_LAG_TARGET=50 SCOPE=both;
通过上面的命令,可以实现日志每 50 秒切换一次。

参考:数据库工程师常见面试题_牛客博客


【附】

中软融鑫hr是个特别温柔的小姐姐,上来还做了自我介绍

然后是腾讯会议视频,填了表约了下午四点面试

之前第一次面试卓望数码,被大佬吊打的感觉历历在目,特别怕再次被吊打,但是也想着多练几次就好了

第一次面卓望数码的数据分析,然后是两个大佬(男),然后上来就自我接受、问专业知识,感觉还是很专业,特别专业的(可惜我太菜了)

然后问的有哈希表冲突解决方式、有问java基础(准备的hadoop没问,都是问Springboot框架有没有做过,还有一堆java框架)、还有arraylist和linklist的区别、项目经历(太小白了我),全程支支吾吾就很菜……当然不期待任何后续了

面试中软融鑫是我的第二次面试

然后小姐姐上来是先自我介绍,我介绍的比较短,然后就问在哪里了解的,有没有考研考公打算,还有什么大学印象深刻的一节课,还说有java工程师,哪个意向更倾向一些。这些都还好。然后说问些专业知识,我以为暴风雨又要来了,结果问的是,导致死锁的原因以及怎么解决(我临时卡住了说了一通,居然说讲的很好),一个sql语句(这个我当时反应很慢,就讲了一下思路),问了事务的ACID,问隔离性是啥我没答出来,然后原子性和一致性说了,问了专业课主要学啥,解决数据查询慢的方法(我说了语句之类的),还有问mysql会不会有故障(我说有),还有一些我记不住了,最后问有没有收到别的offer(我说没有,太实在了),问薪资(我说8,9k,感觉也没谱),当然感觉这次面试确实比上次简单很多,也稍微敢于尝试了!

继续加油吧