Java封神之路:Java面试备战(十五)

六、SpringBoot框架

1、什么是SpringBoot

SpringBoot是在原有的Spring框架的基础之上进行了简化,减少了我们的工作量

2、SpringBoot的优点

1、独立运行

SpringBoot内嵌了各种servlet容器,比如说是Tomcat,我们不需要将项目打成war包部署到容器中,只需要打成一个可执行的jar包就能独立运行

2、简化配置

spring-boot-starter-web启动器自动依赖其他组件,减少了maven的配置

3、无代码生成和XML配置

SpringBoot配置过程中无代码生成,也无需XML配置文件就能完成所有的配置工作

3、SpringBoot的核心注解是什么

启动类上的@SpringBootApplication注解,是SpringBoot的核心注解。主要包含了以下3个注解

  • @SpringBootConfiguration:组合了@COnfiguration注解,实现配置文件的功能
  • @EnableAutoConfiguration:打开自动配置功能,也可以关闭某个自动配置的选项
  • @ComponentScan:Spring组件的扫描

4、运行SpringBoot的几种方式

1、直接执行main方法运行

扫描二维码关注公众号,回复: 12515347 查看本文章

2、打成jar包运行

3、Maven插件运行

5、如何理解SpringBoot中的Starters

Starters可以理解为启动器,它包含了一系列可以集成到应用里面去的依赖包,可以一站式集成Spring及其他技术

七、MySql数据库

1、数据库基础知识

1.1 什么是存储过程?优点是什么?

存储过程是事先经过编译并存储在数据库中一段SQL语句的集合

优点:

1、重复使用:可以重复使用,从而减少数据库开发人员的工作量

2、减少网络流量:存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,降低了网络传输的数据量

3、安全性:参数化的存储过程可以防止SQL注入式攻击

缺点:

1、存储过程往往定制化于特定的数据库,因为支持的编程语言不同,切换其他厂商的数据库系统时,需要重写原有的存储过程

1.2 三大范式

第一范式:

属性不可再分,每个字段都是原子级别的,比如一个Student表,不能说把id、姓名、班号放在一个字段里

第二范式:

满足第一范式的基础之上,消除部分依赖。非主属性完全依赖于主属性。比如说一个Student表中,将id和name作为主键,那么id和name属性就属于主属性,其他的字段属于非主属性。非主属性既要依赖于id又要依赖于name,不能只依赖于其中的一个

第三范式:

满足第二范式的基础之上,消除传递依赖。非主属性直接依赖于主属性,而不是间接依赖于主属性。

1.3 一条SQL语句的执行过程

MySQL 拿到一个查询请求后,会先到查询缓存看看,之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句,value 是查询的结果。如果你的查询能够直接在这个缓存中找到 key,那么这个 value 就会被直接返回给客户端。

但是一般查询缓存的命中率并不是特别高,因为对一个表进行更新操作,这个表的查询缓存就会删除,Mysql8.0删除掉了查询缓存这一部分

1.4 什么视图,视图的使用场景,以及优缺点

视图是从一个或者几个基本表导出的表,它与基本表不同,它是一个虚表。并没有实实在在的数据,数据库中只存放视图的定义,不存放视图对应的数据,这些数据依然是在原来的基本表上。

视图可以理解为一个窗口,透过窗口来看数据,视图的本质是一条查询语句。

创建视图语法

create view 视图名 as 查询语句

视图使用案例

//查询姓张的学生名和专业名
select stuname,mojarname from stuinfo s inner join major m on s.majorid=m.id where s.stuname like '张%';

//创建视图
 create view v1 as select stuname,mojarname from stuinfo s inner join major m on s.majorid=m.id ;
 
//利用视图()
select * from v1 where stuname like='张%';

当多个地方用到同样的查询语句,而这个查询语法很复杂的话,推荐使用视图

优点

1、简化用户操作

2、适当利用视图可以更加清晰的表达查询

缺点

1、从数据库视图中查询数据,性能可能会比较慢

2、视图依赖表结构,当表结构发生变化时,视图也会发生改变

1.5 mysql中explain关键字

1.5.1 id

查询序列号,包含了一组可以重复的数字,表示mysql中执行sql语句的顺序,一般有三种情况:

1、id全部相同,这种情况下的执行顺序是从上往下

2、id不同,这种情况下mysql优先执行id数大的

3、id相同又不同,mysql会优先执行id数大的,然后根据id的顺序从上往下执行

1.5.2 select_type

select_type代表的是查询的类型,主要是用于区别普通查询、联合查询、嵌套查询。类型如下

  • simple:简单查询,代表查询中没有子查询,嵌套等其他操作
  • primary:查询中包含任何的子查询,最外层查询则被标记为primary
  • subquery:代表子查询
  • derived:将子查询标记为衍生,查询结果存放在临时表中
  • union:若第二个SELECT出现在UNION之后,则被标记为UNION;若UNION包含在FROM字句的子查询中,外层的SELECT将被标记为DERIVED
  • union result:从联合表中获取结果

1.5.3 type

类型,效果从好到坏排序如下

system>const>eq_ref>ref>range>index>ALL

1、system:表中只有一行记录,这是const类型的特例,平时不会出现,可以忽略不计

2、const:表示通过索引一次就找到了,const用于比较primary key或者unique索引。因为只匹配一行数据,所以很快。如将主键置于where列表中,MySQL将该查询转换成为一个常量

3、eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条数据与之匹配。常见于主键或唯一索引的扫描

4、ref:非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回的所有匹配某个单独值的行,然而,他可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体

5、range:只检索给定的范围行,使用一个索引来选择行。key列显示使用了哪个索引,一般就是在你的where语句中出现了between、<、>、in等查询,这种范围扫描索引要比全表扫描要好,因为它只需开始于索引的某一点,结束于另一点,不用扫描全部索引

6、index:全索引扫描,Index和all区别是index只遍历索引树,这通常比all快,因为索引文件通常比数据文件小

7、all:全表扫描,将遍历全表以找到匹配的行

一般来说,得保证查询至少达到range级别,最好是ref

1.5.4 possible_key

表示该查询可能会用到的索引,但是实际中并不一定会用到

1.5.5 keys

表示查询语句中实际用到的索引,如果没有使用则为null

1.5.6 key_len

表示索引中使用的字节数,通过key_len计算查询中使用的索引长度,在不损失精度的情况下,索引长度越短越好

1.5.7 ref

显示索引的哪一列或常量被用于查找索引的值

1.5.8 rows

根据表统计的信息以及索引的选用情况,大致估算出找到所需要的记录读取的行数

1.5.9 extra

  • Using filesort:说明mysql读取数据使用的一个外部索引排序,而不是按照表内的索引进行读取,mysql无法利用索引完成的排序成为文件排序
  • Using temporary :使用了临时表保存中间结果,mysql在对查询结果排序时使用临时表
  • Using index:表示使用了覆盖索引
  • Using where :表明使用了where过滤
  • Using join buffer:表明使用了链接缓存

1.6 mysql架构

1.7 不用like如何进行模糊查询

我们通常进行模糊查询的时候采用的是like语句,like语句的性能要差一点

select * from user where name like '%张%'

可以采用下面几种方式代替

1、locate语句

select * from user where locate('张',name)>0

2、position

select * from user where position('张' in name)

3、instr语句

select * from user where instr(name,'张')>0

1.8 mysql中存储页

1.9 页分列

1.10 SQL语句优化

1、在表中建立索引,优先考虑where、group by使用的字段

2、尽量避免使用select *,返回的无用字段会降低查询效果

3、尽量避免使用in 或者not in,会导致数据库引擎放弃索引

4、尽量避免使用or,会导致数据库引擎放弃索引

5、尽量避免在字段的开头使用模糊查询,会导致数据库引擎放弃索引进行全表扫描

6、 尽量避免null值判断,会导致数据库引擎放弃索引

1.11 在设计数据库时,是不是范式级别越高越好

答案肯定是否。

1.12 超键、候选键、主键、外键分别是什么

  • 超键:在关系中唯一标识元组的属性集称为关系模式的超键。一个属性可以作为一个超键,多个属性组合在一起也可以作为一个超键。超键博爱韩候选键和主键
  • 候选键:是最小超键,即没有冗余元素的超键
  • 主键:数据库表中对存储数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,并且主键的取值不能缺失,不能为null
  • 外键:一个表中存在另外一张表中的主键,称为此表的外键

1.13 varchar和char

1、定长和变长

char表示定长,长度固定,varchar表示

2、存储容量不同

对于char来说,最多能存放255个字符

而varchar最多能存放65532个字符

2、Mysql中的索引

2.1 索引是什么

  • 官方介绍,索引是帮助MyISAM高效获取数据的数据结构,可以将索引理解成为目录,能加快数据库查询的速度
  • 通常说的索引,包括聚集索引、覆盖索引、组合索引等。MySql使用B+Tree作为索引的数据结构
  • 一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往是存在磁盘中,可以是单独的索引文件,也可能和数据一起存储在数据文件中

创建索引的sql语句

create index index_name on table_name(字段名)

2.2 索引的优势和劣势

优势:

  • 可以提高数据检索的效率,降低数据库的IO成本
  • 通过索引列对数据进行排序,降低了数据排序的成本,也降低了CPU消耗

​ 索引列会自动进行排序,对应使用Order by语句来说会快很多

劣势:

  • 索引会占磁盘空间,所以所当表中数据比较少的时候不推荐使用索引,读磁盘毕竟挺耗时的
  • 索引虽然会提高查询效率,但是会降低表的更新效率。你对表的增删改查,需要对索引进行维护

2.3 索引的分类

单列索引

  • 普通索引:Mysql中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值
  • 唯一索引:索引列中的值必须是唯一的,但是允许为空值
  • 主键索引:特殊的唯一索引,不允许有空值

组合索引

  • 在表中的多个字段组合上创建的索引
  • 组合索引的使用,需要遵循最左前缀原则
  • 一般情况下,建议使用组合索引代替高级索引

2.4 可用作索引的数据结构有哪些

2.4.1 二叉树

2.4.2 红黑树

2.4.3 Hash表

2.4.4 B树

2.4.5 B+树

2.5 索引的基本原理

索引用来快速查询那些具有特定值的记录。如果没有索引,一般来说执行查询的时候遍历整张表。索引的原理就是把无序的数据变得有序

1、把创建了索引的列的内容进行排序

2、对排序结果生成倒排表

3、在倒排表内容上拼上数据地址链

4、在查询的时候,先拿到倒排表的内容,再取出数据地址链,从而拿到具体数据

2.6 索引设计的原则

1、适合索引的列是出现在where子句中的列,或者连接子句中的列

2、基数较小的类,索引效果较差,没有必要再此列创建索引

3、使用短索引,如果对长字符串进行索引,应该指定一个前缀长度,这样能够节省大量的索引空间

4、不要过度使用索引。索引需要额外的磁盘空间,并降低写操作的性能,修改表的时候,还要维护索引

2.7 创建索引的原则

1、最左前缀匹配原则

2、较为频繁作为查询的字段才去创建索引

3、更新频繁的字段不适合创建索引

4、如果是不能有效区分数据的列不适合做索引列。比如说性别

5、尽量的扩展索引,不要新建索引。

6、定义有外键的数据列一定要建立索引

7、对于那些查询很少涉及的列,重复值较多的列不要建立索引

8、对于定义为text、image和bit的数据类型的列不要建立索引

2.8 创建索引的注意事项

  • 非空字段:应该指定列为not null,在mysql中,含有空值 的列很难进行查询优化
  • 取值离散大的字段:该字段重复值少
  • 索引字段越小越好:字段越小,存储页上存储的索引就会越多

2.9 聚簇索引/非聚簇索引/覆盖索引

在Innodb下主键索引是聚簇索引,在MyISam下主键索引是非聚簇索引

聚簇索引的叶子节点存放的是主键值和数据行

非聚簇索引的叶子节点存放的是索引数据,数据行单独存放在另一个文件里

索引覆盖指一个查询语句的执行只用从索引中就能够取到,不必从数据表中获取

2.10 索引下推

  • 索引下推是在非主键索引上的优化,可以有效减少回表的次数,大大提升查询的效率

2.11 索引失效

  • 违反最左前缀原则
  • 使用in和not in
  • 没有查询条件,或者查询条件没有创建索引
  • 在查询条件上没有使用引导列
  • 查询的数量是大表的大部分

猜你喜欢

转载自blog.csdn.net/weixin_54707168/article/details/113977313