Java面试题系列(三)——数据库

2021-05-23  本文已影响0人  嗨吖呀

1. 数据库设计准则

2. MySQL数据库引擎

https://www.jianshu.com/p/4bb9f78b4f6d
InnoDB主要面向在线事务处理(OLTP)的应用。MyISAM主要面向一些联机分析处理OLAP的应用。

3. 为什么MyISAM查询比Innodb快?

INNODB在做SELECT的时候,要维护的东西比MYISAM引擎多很多:

4. 数据库保证并发性(MVCC)

https://www.jianshu.com/p/8845ddca3b23
  MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读。

5. mysql的主从复制

  MySQL主从复制是其最重要的功能之一。主从复制是指一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器之中。对于多级复制,数据库服务器即可充当主机,也可充当从机。MySQL主从复制的基础是主服务器对数据库修改记录二进制日志,从服务器通过主服务器的二进制日志自动执行更新。MySQL主从复制的两种情况:同步复制和异步复制,实际复制架构中大部分为异步复制。

6. 索引

7. Mysql索引分类

8. Hash索引和B+树索引的区别

9. 回表和覆盖索引

10. 索引创建原则

11. 索引失效的情况

12. B+树

13. 为什么用B+树而不是B树?

14. B树、B-树、B+树、B*树

https://www.jianshu.com/p/92d15df75027

15. 乐观锁和悲观锁

16. 事务

1)未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据。
2)已提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)。
3)可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读,即后一次查询看到了前一次查询没有看到的行。
4)串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞。

17. 事务的实现原理

18. 脏读、不可重复读、幻读

19. 为什么实际开发中使用已提交读更多?

20. 间隙锁(Gap)

21. 快照读和当前读

22. 对象属性与数据库字段不一致

1)Sql语句起别名
2)Mapper.xml中的resultMap自定义映射,<result column=”” property=””>
3)配置文件中开启驼峰命名规则(对象属性为驼峰命名)

23. 数据库优化方法

(1)选取最适用的字段属性
  MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。例如,在定义邮政编码这个字段时,如果将其设置为CHAR(255),显然给数据库增加了不必要的空间,甚至使用VARCHAR这种类型也是多余的,因为CHAR(6)就可以很好的完成任务了。同样的,如果可以的话,我们应该使用MEDIUMINT而不是BIGIN来定义整型字段。另外一个提高效率的方法是在可能的情况下,应该尽量把字段设置为NOT NULL,这样在将来执行查询的时候,数据库不用去比较NULL值。
  对于某些文本字段,例如“省份”或者“性别”,我们可以将它们定义为ENUM类型。因为在MySQL中,ENUM类型被当作数值型数据来处理,而数值型数据被处理起来的速度要比文本类型快得多。这样,我们又可以提高数据库的性能。
(2)使用连接(JOIN)来代替子查询(Sub-Queries)
  MySQL从4.1开始支持SQL的子查询。这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中。例如,我们要将客户基本信息表中没有任何订单的客户删除掉,就可以利用子查询先从销售信息表中将所有发出订单的客户ID取出来,然后将结果传递给主查询
(3)使用联合(UNION)来代替手动创建的临时表
  MySQL从4.0的版本开始支持union查询,它可以把需要使用临时表的两条或更多的select查询合并的一个查询中。在客户端的查询会话结束的时候,临时表会被自动删除,从而保证数据库整齐、高效。使用union来创建查询的时候,我们只需要用UNION作为关键字把多个select语句连接起来就可以了,要注意的是所有select语句中的字段数目要想同。
(4)事务
  尽管我们可以使用子查询(Sub-Queries)、连接(JOIN)和联合(UNION)来创建各种各样的查询,但不是所有的数据库操作都可以只用一条或少数几条SQL语句就可以完成的。更多的时候是需要用到一系列的语句来完成某种工作。但是在这种情况下,当这个语句块中的某一条语句运行出错的时候,整个语句块的操作就会变得不确定起来。设想一下,要把某个数据同时插入两个相关联的表中,可能会出现这样的情况:第一个表中成功更新后,数据库突然出现意外状况,造成第二个表中的操作没有完成,这样,就会造成数据的不完整,甚至会破坏数据库中的数据。要避免这种情况,就应该使用事务,它的作用是:要么语句块中每条语句都操作成功,要么都失败。换句话说,就是可以保持数据库中数据的一致性和完整性。事物以BEGIN关键字开始,COMMIT关键字结束。在这之间的一条SQL操作失败,那么,ROLLBACK命令就可以把数据库恢复到BEGIN开始之前的状态。

24. 慢查询优化方式

https://blog.csdn.net/qq_35571554/article/details/82800463

25. 数据库水平切分与垂直切分

  垂直拆分就是要把表按模块划分到不同数据库表中(当然原则还是不破坏第三范式),这种拆分在大型网站的演变过程中是很常见的。当一个网站还在很小的时候,只有小量的人来开发和维护,各模块和表都在一起,当网站不断丰富和壮大的时候,也会变成多个子系统来支撑,这时就有按模块和功能把表划分出来的需求。其实,相对于垂直切分更进一步的是服务化改造,说得简单就是要把原来强耦合的系统拆分成多个弱耦合的服务,通过服务间的调用来满足业务需求看,因此表拆出来后要通过服务的形式暴露出去,而不是直接调用不同模块的表,淘宝在架构不断演变过程,最重要的一环就是服务化改造,把用户、交易、店铺、宝贝这些核心的概念抽取成独立的服务,也非常有利于进行局部的优化和治理,保障核心模块的稳定性。垂直拆分:单表大数据量依然存在性能瓶颈
  水平拆分,上面谈到垂直切分只是把表按模块划分到不同数据库,但没有解决单表大数据量的问题,而水平切分就是要把一个表按照某种规则把数据划分到不同表或数据库里。例如像计费系统,通过按时间来划分表就比较合适,因为系统都是处理某一时间段的数据。而像SaaS应用,通过按用户维度来划分数据比较合适,因为用户与用户之间的隔离的,一般不存在处理多个用户数据的情况,简单的按user_id范围来水平切分。
  通俗理解:水平拆分行,行数据拆分到不同表中,垂直拆分列,表数据拆分到不同表中。

26. Statement 和 PreparedStatement 的区别

与Statement相比,PreparedStatement接口代表预编译的语句,它主要的优势在于:

27. MyBatis 中 #{} 和 ${} 的区别

select * from ${tableName}
select * from t_user order by ${columnName}

28. select *缺点

29. Mysql窗口函数

30. left join 、right join 、inner join之间的区别

31. 共享锁和独占锁的使用

上一篇 下一篇

猜你喜欢

热点阅读