JAVA面经

给每一个哈希桶加锁,排队等待的人会变少,锁的粒度大小取决于并发量

mysql中的乐观锁和悲观锁是如何实现的

1)日志保证数据不丢失和事务实现

2)存储地址尽量分割成几个字段去填,淘宝的京东在进行填写货物的地址的时候,先让你进行填写省,接下来让你选择市,区,接下来是详细地址,为什么不把用户的地址分割成一个字段呢?将地址分割几个成几个字段,每一个字段都被拆分成不可分割的最小单元,假设有一天某一个行政单位发生改变,有一天,口琴村变成XX村了,此时如果都写到一块,此时字段就不好修改,替换的时候还会影响其他的,如果表中的字段都是不可分割的最小单元,那么此时就很方便的进行替换了还不会影响其他的字段;

3)一个表当存在联合主键,有两个主键字段充当整张表的联合主键(一个主键),不能说有一个非主键字段只依赖于联合主键中的一个而不依赖另一个联合主键,不能存在非主键字段对于部分主键的依赖,一定要对联合主键都依赖;

4)表中的列不存在对非主键列的传递函数依赖,一个非主键列3推出非主键列2,非主键列2推导出主键列1,从而非主键列3推出主键列1

InnoDB支持崩溃修复和自增列的,崩溃修复本身是依靠日志来实现的,底层是依靠日志,Redolog重写日志,重写日志就可以实现崩溃修复,就是数据信息还没有刷盘到MYSQL的磁盘里面,MYSQL崩溃了,此时MYSQL就可以使用Reddolog来实现崩溃修复

InnoDB依靠readdolog,重写日志,数据还没有进行落盘,还没有放入磁盘里面,突然掉电了,突然发生意外事故了,此时有undolog,就可以崩溃修复了,但是MSIM崩溃之后就需要人工手动恢复操作可能会导致数据的丢失和数据完整性的不一致问题

InnoDB和MISIM的非聚簇索引的叶子节点存放的东西不一样

当创建唯一约束的时候,就会创建唯一索引,见唯一约束的时候,当进行添加修改操作的效率比较高,唯一索引是快速实现唯一约束的底层的一个判断,但是唯一约束是进行数据的检查的,但是唯一索引是进行数据的检索和判断和查询的;

当创建主键约束的时候,就会创建一个主键索引

B+树本身是一个多叉树,节点更加矮胖,IO次数比较少

节点之间是使用有序链表实现的,进行范围查询和遍历速度会更高

B树叶子和非叶子节点都存储数据只能使用深度遍历或者是广度遍历才可以 

 B+树相比于B树有什么优势吗?

1)IO次数更少:B+树的非叶子节点不存放具体的实际的记录数据而是存放索引,B树的所有结点既存放用户的数据又存放索引因此当数据量相同的情况下,B+树的非叶子节点可以存放更多的索引,因此在查询的时候IO查询次数更少,效率更高,16K的页只存ID,是可以存储很多ID的,但是如果这个16K页既存储数据又存储ID,在同一个页中,存储的ID就会比B+树同等的叶子节点少很多,B+树的非叶子节点一次IO可以得到更多的ID,那么在同等查询下,遍历B+树的非叶子节点的个数就要B树少,比B树遍历IO次数就会很少,效率会很高;

2)范围查询性能更好:

3)红黑树本质上是二叉树,插入很麻烦,频繁左旋右旋,一个节点值只能存放一个数据,是可以要满足平衡二叉树的性质,需要大量的旋转和更改颜色来维持红黑树的特性,增删效率都很低,查询也不行每一个节点既存放ID又存放数据,但是B+树,最终所有的节点都存放在叶子节点上面

MYSIM的索引文件和数据文件是分割开的,但是InnnoDB本身就是一个文件,MYSIM聚簇索引也是需要查询两次,叶子节点是存放数据的地址,需要根据地址再拿数据,MYSIM的非聚簇索引叶子节点里面存放的也是数据的地址,所以整体来看MYSIM二级索引比InnoDB的二级索引查询效率要更高的

所以说为啥不建议使用select *(一定是回表查询),尽量用啥查啥(可能会触发索引覆盖)

JAVA面经_第1张图片

JAVA面经_第2张图片

这里是不会走索引的,因为只有第一种情况下才是最确定的情况,b c情况不确定,所以不走索引

使用列运算,使用列运算的值属于一个不确定的值,对于一个不确定的东西是不能精准的查询,同理使用函数也是不能确定最终生成的结果是什么,is null确定,is not null不确定是具体的值,不确定的类型转换,1,2,3,4,5都是不确定的;

create index indexs on user(username,age,password);

explain select username,password from user where password="zhangsan";

聊聊索引失效的10种场景,太坑了 - 知乎 (zhihu.com)

create table user(userID int,username varchar(40),age int,password varchar(40));

insert into user values(1,"a",10,"12503487");

insert into user values(2,"b",20,"1503487");

insert into user values(3,"c",10,"125487");

insert into user values(4,"e",11,"1347");

create index indexs on user(username,age,password);

explain select * from user where password="zhangsan"; 

JAVA面经_第3张图片

explain select username,password from user where password="zhangsan";

OR 操作符可能会导致索引失效,是因为当使用 OR 操作符时,数据库无法确定哪个条件会匹配,因此可能需要扫描整个表来找到符合条件的行

select_type:单表查询,连表查询

key:实际走的索引的名称 

type:到底走没走索引,const查询效率第二高

system是第一高就是当数据库只有一条数据,况且主键查询

rows:在多少条字段中查询到的

fitter:查询到的概率

possiblekeys:表示查询的时候可能会使用到的索引

就是那个最左前缀法则比如说(a b c)建立联合索引,select * from user where a=10 and b>8 and c=3,他这个只有a和b走索引,但是我感觉他为啥c也不走索引呀,这样MYSQL设计有点不好吧,他这个联合索引是先按照a排序,a相同,再按照b排序,b相同再按照c排序,就我上面的那个SQL语句,完全先找a=10的,再从a=10的找b大于8的,然后在b大于8的找c=3的这样子也挺快呀?但是实际上c不走索引感觉有点不好,MYSQL为啥要这样子设计呀
就是上面的二项式简单的化简之后变成下面简易的二项式,然后况且老师你说的桶为空的概率是哈希到数组的位置桶为空的概率是吗

当数组为空的时候使用volatile初始化的目的是防止有其他线程已经初始化过这个数组(内存可见性),然后就是这个使用CAS设置该节点就是为了防止有别的线程已经设置了该节点,如果发现有人设置了该节点CAS设置失败,直接synchronized给这个哈希桶加锁

总的来说,就是线程切换或者加锁解锁都是因为需要用户态和内核态的切换,从而导致的开销大

你可能感兴趣的:(java,开发语言)