java 面试知识点突击-(81-90)
Posted 栗子~~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 面试知识点突击-(81-90)相关的知识,希望对你有一定的参考价值。
文章目录
前言
如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!
java 知识点扫盲目录
https://blog.csdn.net/weixin_38316697/article/details/121991582
java 面试知识点突击-(81-90)
81 建了索引但是用不上的情况?
1)查询数据内容不走左匹配
2)查询字段使用函数运算
3)查询没有使用联合索引最左边的列
82 多个独立索引和联合索引的选择?
当多个字段会在一个条件中查询的场景下,使用联合索引,因为更有可能走索引覆盖
永远只是单一列的查询, 使用多个独立索引。
83 mysql 中涉及NULL容易忽略的坑?
(1)sum函数没统计到任何记录的时候返回null;
解决:可以使用IFNULL函数把NULL转换为0.
(2)count字段不统计NULL值
解决:可以使用IFNULL函数把NULL转换为0.
(3)对NULL的操作如<,>,=这样的算数比较操作符比较的结果都是null,没有意义;
解决:用 is not null,is null,或者 isnull()函数
84 select语句带有什么锁类型?
select语句默认不加任何锁类型。
例:
一行数据加上排他锁后,其他事务不能再在其上加其他的锁,但可以直接通过select …from…查询数据,因为普通查询没有任何锁机制。
85 mysql执行计划怎么看?
explain 关键字
优化sql的关键字段:
type:判断优化sql的重要指标
围绕type字段为核心,
类型范围:
system:表中只有一行记录;
count:通过索引一次命中,匹配一行数据;
eq_ref:唯一索引扫描;
ref:非唯一索引扫描,返回匹配某个值的所有;
range:只检索给定范围的行,使用一个索引来选择行,一般用于between 、<、>;
index:只遍历索引树;
ALL:全表扫描、压根就没走索引;
注:效率越往下越低。
86 事务的基本特性和隔离级别?
ACID:
1、原子性
要么全部成功、要么全部失败
2、一致性
事务的最终目的,通过原子性、隔离性、持久性达到一致性的目的
3、隔离性
一个事务操作这个资源的时候,其他事务不可操作,即一个事务的修改在最终提交前,对其他事务是不可见的
4、持久性
一旦提交,修改就会永久保存在数据库
隔离机制:
1、read uncommitted (未提交读、脏读)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
2、read committed(提交读、不可重复读) - oracle的默认级别
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
3、repeatable read(可重复读) -mysql的默认级别
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
4、serializable(可串行化)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
87 ACID靠什么保证?
A-原子性 由undo log日志保证;
C-一致性 由其他三个特性保证、程序代码保证业务上的一致性;
I-隔离性 由MVCC保证;
D-持久性 由内存+redo log保证,修改的同时向内存和redo log同时记录,宕机的话,从redo log 恢复;
88 什么是MVCC,MVCC的原理是什么?
多版本并发控制
概述:
读取数据时,通过类似快照的方式将数据保存下来,这样读和写就不冲突了,
不同事务session会看到自己特定版本的数据,版本链。
MVCC 只在提交读和可重复读两种隔离级别下存在。
原理:
1、开始事务时,创建readview(维护当前活动的事务id),即未提交的事务id,排序成一个数组;
2、访问数据时,获取数据中的事务id(取版本链中最大的记录),对比readview;
3、id在readview 左边,说明是已提交的事务,可以访问;
4、id在readview 右边或中间,说明是未提交事务id,不可访问;
5、取版本链中上级数据中的事务id,继续跟readview对比,以此类推,直到获取的id在readview 左边,可以访问为止;
已提交隔离级别和重复读隔离级别下的MVCC区别:
已提交:每次查询的时候都会生成一个readview
重复读:第一次读的时候,生成一个readview,之后读都复用前一个readview
89 mysql 主从同步原理?
binlog 日志是主从复制的基础,即主库记录数据库的所有变更记录都会记录在binlog。
主从节点使用binlog文件+偏移量来定位主从同步位置,从节点会保存接受到的偏移量,
如果从库发生宕机,下次则会自动从偏移量发起同步。
mysql主从同步默认是异步,复制方式:
1、全同步复制
主库写入binlog后强制同步到从库,所有的从库节点都完成后,才返回给客户端,这种方式性能会严重收到影响。
2、半同步复制
相比全同步复制,半同步复制是主库只要收到一个从库节点返回的确认消息,就认为写作完成。
90 mysql中的索引类型?
1、普通索引:允许被索引的数据列可以有重复的值;
2、唯一索引:被索引的数据列不可以有重复的;
3、主键:特殊的唯一索引,主键只能有一个,innoDB中为聚族索引;
4、联合索引:索引可以覆盖多个数据列;
创作不易、点关注、不迷路
点击主页、更精彩 !!!
以上是关于java 面试知识点突击-(81-90)的主要内容,如果未能解决你的问题,请参考以下文章