Java面试之Mysql及mybatis

本章主要总结一些mysql相关的面试题,废话不多说,开搞

1. 数据库三大范式?

列不可拆;非主键完全依赖主键,而非部分主键;非主键列只依赖于主键列;直接相关,而不能间接相关

2. mysql权限表有哪些?

user,db,table,column,(从用户向下细分),host则是结合db对用户分权限

3. binlog有有几种录入格式?

statement,row,mixed,statement记录较为粗略节约性能,row更细致但耗费性能,mixed就是折中两者

4. mysql数据类型

整数:tiny,small,medium,普通,bigint五种,分别是12348字节;实数:float,double,decimal;字符串:varchar,char,blob,text;枚举:enum,把不重复而且不常用的数据存为一个集合;日期:datetime,timestamp等,如果存微秒可以用bigint

5. 索引相关?

索引就相当于书的目录,可以提高查找速度,这是其优点,缺点就是需要改数据时加以动态维护,并且耗费空间

6. 创建索引的原则

(1)适合的情况:查询操作多的字段,有外键的字段(2)不适合的情况:字段区分度要高,比如性别,只有男女未知,区分度低不必索引;查询不多的字段不索引,bit,image,text不索引;更新频繁的字段不索引;索引可以改旧的就不要建新的

7. 索引使用场景?

where,orderby,join ; 使用方法:alter table 表名 add index(字段名)

8. 数据库特性

acid,atom原子性,consistency,一致性,i,isolation隔离性,d,durable,持久性

9. mysql分页

limit:第一种a,b,意思是从第a到a+b条,第二种:a,-1,意思是a到最后一条数据;第三种,a,意思是前a条数据

10. 字段为什么要求定义为not null?

null会占用更多空间,且会在业务中引起很多错误

11. 如何分表

垂直分表:把一个表的字段分开多个表,其中字段除了共有主键,其他的都不重复
水平分表:不拆字段,只把数据分开

12. 数据表损坏的修复方式

myisamchk

13. 几种复杂语法:

join,分left,right,inner,full几种join,mysql中不支持full outer,即全外连接

14. 最左前缀原则是什么

当一个SQL想要利用索引是,就一定要提供该索引所对应的字段中最左边的字段,也就是排在最前面的字段,比如针对a.b.c三个字段建立了一个联合索引,那么在写一个sql时就一定要提供a字段的条件,这样才能用到联合索引,这是由于在建立abc三个字段的联合索引时,底层的B+树是按照abc三个字段从左往右去比较大小进行排序的,所以如果想要利用B+树进行快速查找也得符合这个规则

15. 几种join,left就是左表全部和右表符合的数据,right就是右表全部和左表符合的数据,inner就是左右交集,full就是两表全部数据,重复的只会显示一编,这一点同并集交集的概念类似
16. 什么是视图?视图的优缺点?

视图就是一种虚拟表,使用视图可以隔离对表的操作,提高安全性,可以提高数据的逻辑独立性,但是对视图的查询需要转化为对表的查询,费时间,其次修改视图还要涉及到改表,一些复杂的表难以修改

17. 什么是游标?

一种类似指针的东西,可以遍历数据库的查询结果,在其中获取想要的结果,这比直接查数据库好很多

18. SQL语句主要分为哪几类

数据定义语言DDL,create,dropalter
数据查询语言DQL,select
数据操作语言DML,insert,update,delete
数据控制语言DCL,grant,revoke(撤销),commit,rollback

19. 数据库事务

数据库中最基本的操作,不可再分割,例如转账,a转一笔钱给b,那么a账户钱少了,b账户钱多了,这两个必须同时执行,如果a少了,b没多,就出错误了

20. 数据库四大特性

acid,原子性,一致性,隔离性,持久性

21. 什么是脏读?幻读?不可重复读?如何解决?

脏读:a和b同时向一个字段修改,a改的半途,b回滚了,那么就不一致了
幻读:a查了一次,b插入一条,a又要插入,发现已经存在了
不可重复读:类似幻读,a两次查询中,b对第一次查询的数据进行了修改,那a两次查询就不一致了
解决办法是隔离机制,四种隔离机制,三种读依次解决,最后一种可以解决所有

22. 对MySQL的锁了解吗

锁就是用来避免高并发下产生的操作冲突,用访问限制来对访问顺序进行安排,

23. 隔离级别与锁的关系?

锁分共享锁和排他锁,共享锁是指大家都能看,但不能改动,排他锁是指一个人改的时候,别的人不能改;
在读取未提交下,共享锁无需加,因为可能会与排他锁冲突
读取以提交下

24. 按照锁的粒度分数据库锁有哪些?

行级锁,表级锁,页级锁
行级最细,冲突可能最小,开销最大,性能最慢
表级最粗,冲突可能最大,开销小,性能快,这两种级别都有共享与排他锁的种类
页级是介于这两种之间,性能,冲突居中

25. 什么是死锁?怎么解决?

死锁就是多个用户访问一个资源,互相使用锁锁定资源并由此产生循环冲突
1、尽量让各个地方以相同顺序访问资源
2、尽量一次锁定所有需要使用的资源
3、增加粒度,使用表级别
都不行就用分布式事务锁或者乐观锁

26. 数据库的乐观锁和悲观锁是什么?怎么实现的

两者都是数据库在并发控制时使用的策略,乐观锁就是假设不会发生冲突,在修改时上锁;一般是在读操作多的时候使用,可以节约性能;使用数据库中的锁机制实现
悲观锁就是假设会冲突,在提交事务前都锁起来,一般是在写操作多时使用,耗费性能大,但比起上层事务发生冲突不断请求,还是节约了性能,使用cas算法实现

27. 超键、候选键、主键、外键分别是什么?

超键就是能唯一标识一个元组属性的东西,包含候选键和主键
候选键就是最小没有冗余元素的超键

28. SQL 约束有哪几种

notnull 非空,primary key主键,foreign key外键,check取值范围,unique,这个字段下数据内容不能重复

29. mysql中 in 和 exists 区别

in和exists功能相似,但在子查询大表用exists好,表小用in好

30. varchar与char的区别

varchar长,上限65532,存多长就是多长;是变长,
char短,上限255,多余的用空格填充;是定长,操作速度快,属于空间换时间

31. varchar(50),varchar(x)代表x字符长度;与之区别的int(x)这种,代表显示x长度,是为了便于报表显示
32. UNION与UNION ALL的区别?

union all不会合并重复行,效率也较低

33. 字段为什么要求定义为not null?

null会占用更多空间,而且会在业务中造成一些错误

34. 如果要存储用户的密码散列,应该使用什么字段进行存储?

应该用char而非varchar,因为可以加快速度

35. 常见的数据库优化手段

一般是在语句层面优化
在这里插入图片描述
在这里插入图片描述
更复杂的有DBA层级调优,乃至数据库中间件和infra层级调优

36. 数据库连接池
37. 数据库连接池

(connection pool)是程序启动时建立多个数据库连接,并将这些连接组成一个连接池,统一进行管理,由程序动态地对池中的链接进行申请,使用,释放。
资源复用
更快的系统相应速度
统一的连接管理,避免数据库连接泄露
避免多个线程同时使用一个连接

38. druid的常用配置

连接数
对于计算密集型,连接数和线程数设置成N + 1;
对于io密集型,设置成 2 * N + 2。
对于计算+io密集型,可以算一下计算时间占总的任务时间的比例,最后算出单个CPU的饱和线程数量,同个这个来设置线程数和连接数。
最终还是要根据具体业务结合在一起,经过大量测试,设置适合的参数

39. JDBC连接数据库步骤

一、DriverManager加载驱动
二、获取connection连接
三、创建statement执行sql语句
四、返回ResultSet执行结果

40. statement中常用三个方法

在这里插入图片描述

41. ResultSet结果集
	![在这里插入图片描述](https://img-blog.csdnimg.cn/60fd8dac6d764fffb312234efae2d236.png)
42. preparedStatement

在这里插入图片描述

43. MySQL 和 Oracle 区别?

Oracle是大型数据库,Mysql是中小型数据库
Oracle占有内存空间大,Mysql占有小
Oracle支持大并发访问量,是OLTP最好的工具,Mysql并发小,面对大访问量可以做分表分库优化
Oracle没有自动增长类型,Mysql一般使用自动增长类型
Oracle处理分页的SQL语句就比较繁琐了。每个结果集只有一个ROWNUM字段标明它的位置,并且只能用ROWNUM<100,不能用ROWNUM>80,MYSQL处理分页的SQL语句比较简单,用LIMIT开始位置,记录个数
MYSQL的非空字段有空的内容,ORACLE里定义了非空字段就不容许有空的内容。按MYSQL的NOT NULL来定义Oracle是is null
MYSQL里用 字段名 like ‘%字符串%’,ORACLE用 字段名like '%字符串%'但不能使用索引,速度不快。【like ‘%’开头 无法使用索引 不使用开头 可以使用索引】
Oracle实现了ANSII SQL中事务的隔离级别、传播特性等比Mysql强;

44. Oracle怎么把一个字段的内容注入另一字段

可以考虑用主外键关联,或者update 字段=(select 原字段)

45. oracle查询前十条数据

select *
from 表名
where rownum <=10

46. 一对一,一对多,多对多?

一对一:在任意一方引入对方主键作为外键。
一对多:在“多”的一方,添加“一”的一方的主键作为外键。
多对多:产生中间关系表,引入两张表的主键作为外键,两个主键成为联合主键或使用新的字段作为主键。

47. MySQL数据库引擎有哪些

show engines可查看所有引擎
在这里插入图片描述比较常用的是
InnoDB
MyISAM
MEMORY

48. oracle序列

:MySQL有自动增长的数据类型。Oracle没有自动增长的数据类型,需要建立一个自增序列,Oracle提供了SEQUENCE对象,由系统提供自增长的序列号,通常用于插入
之后发现有mybatis的面试题,反正也是持久层框架

49.#和$的区别

#{}是预编译处理,${}是字符串替换。

Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;

Mybatis在处理 时 , 就 是 把 {}时,就是把 时,就是把{}替换成变量的值。

使用#{}可以有效的防止SQL注入,提高系统安全性

50.简单介绍一下Mybatis?

Mybatis是一个半ORM(对象关系映射)框架,内部封装了JDBC,开发时只需要关注SQL语句本身,不需要去处理驱动、连接、statement过程。可以严格控制sql执行性能,灵活度高。

51. 什么是DBMS?

DBMS:数据库管理系统(database management system)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数zd据库,简称dbms。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。

用户通过dbms访问数据库中的数据,数据库管理员也通过dbms进行数据库的维护工作。它可使多个应用程序和用户用不同的方法在同时版或不同时刻去建立,修改和询问数据库。

DBMS提供数据定义语言DDL(Data Definition Language)与数据操作语言DML(DataManipulation Language),供用户定义数据库的模式结构与权限约束,实现对数据的追加权、删除等操作。

52.Mybatis的一级、二级缓存:

1)一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Session flush或close之后,该 Session中的所有Cache就将清空,默认打开一级缓存。
2)二级缓存与一级缓存其机制相同,默认也是采用PerpetualCache,HashMap存储,不同在于其存储作用域为Mapper(Namespace),并且可自定义存储源,如Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置 ;
3)对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行了C/U/D操作后,默认该作用域下所有select中的缓存将被clear。

附:

mysql的题还是多,因为相关的语句多,还有一些使用经验,以后慢慢更新吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值