第二天面试

索引

1.索引类型

Fulltext:全文索引、Hash:哈希索引—>唯一—>一次定位、

Btree:树形索引—>存入树形结构、Rtree:空间数据索引

树形索引:存入一个树形的数据结构中(二叉树)、每次查询都是从树的入口root开始,依次遍历node-获取leaf。Mysql,默认和常用的索引类型。

2索引种类

普通索引:仅加速查询

唯一索引:加速查询+列值为一(可以null)

主键索引:加速查询+列值为一(不可null)+表中只有一个

组合索引:多列值组成一个索引,专门用于组合搜索,效率大于索引合并

全文索引:对文本内容进行分词,进行搜索。

常用的SQL语句

1.创建数据库:create databass 数据库名

2.删除数据库:drop databass 数据库名

3.创建数据库:

4.删除表:drop table 表名

5.添加主键:alter table 表名 add primary key (co1)

6.删除主键:alter table 表名 drop primary key (co1)

7.创建索引:create  [unique] index idxname ont 表名 (co1)

8.删除索引:drop index idxname  

9.插入:insert into table (字段1,字段2) value (value1,value2)

10.删除:delete from table where 范围

11.选择:select * from table where 范围

12.更新:update table set 字段=值 where 范围

13.查找:select * from table where 字段 like '%value%'

14.排序:select * from table order by 字段1,字段2[desc]

15.总数:select count as totalcount from table

16求和:select sum(字段)as sumvalue from table

17.平均:select avgsum(字段)as avgvalue from table

18.最大:select max(字段)as maxvalue from table

19.最小:select min(字段)as minvalue from table


事务

1.四个属性:

原子性:必须是一个原子工作单元,对于数据的修改,要么全部执行,要么全部不执行

一致性:在完成时,必须所有的数据都保持一致

隔离性:由于并发事务所做的修改必须与任何其他的并发事务所做的修改隔离

持久性:事务完成后,对于系统的影响是永久的

2.实现原理

​ 事务形成后,事务所有的操作会被陆续的写到事务日志中,写到日志中的操作分为两种,一种针对数据,一种针对任务,针对数据即插入、删除、修改,针对任务:创建索引。在事务日志中有一个标记,用于表示执行这种操作。

​ 当取消事务时,会自动执行这种操作的反操作,保证系统的一致性。

​ 系统自动生成检查点机制,周期发生,周期是系统根据用户定义的时间间隔和系统活动的频繁度由系统自动计算时间间隔。如果全部完成,检查点事务会在事务日志中的事务提交到数据库,并在事务数据库中做一个检查点提交标志,如果未完成,不会提交到数据库中,在数据库中做一个检查点未提交标志。

Vue中一些常见的命令

v-for、v-if

v-show:控制元素显示/隐藏 display none

v-moder :实现表单输入和应用状态之间的双向绑定

v-bind:动态绑定一个或多个特性。

写出Map的三种典型循环方式

1.遍历健(返回的是set)

 
//键的迭代器遍历
Set<String>keys = map.keySet();//获取键的集合
Iterator<String>it = keys.iterator();
while(it.hasNext()){
    String key = it.next();//找出迭代器中的每一个键
    Integer value = map.get(key);//通过键找出相应的值
    System.oout.println(key+"\t"+value);
}
 
 
//键的foreach遍历
 
Set<String>keys = map.keySet();
for(String key:keys){
    Integer value = map.get(key);
    System.out.println(key+"\t"+value);
}

2.遍历值(返回的是conllertion集合)

Collection<Integer>values = map.values();//获取所有的值
Iterator<Integer> it = values.iterator();
while(it.hasNext()){
    Integer value = it.next();//获取迭代器中每一个值(value)
    System.out.println(value);
}

3.entrySet遍历:

​ 每个Map.enery对象代表一个键值对,然后迭代set,获取每个映射对象,并分别调用对象的geteKy()和getValue()方法获取键值

//每个Map.Entry对象代表Map中的一个键值对
Set<Map.Entry<String,Integer>> entrySet = map.entrySet();
Iterator<Map.Entry<String,Integer>>it = entrySet.itteator();
while(it.hasNext()){
    Map.Entry entry = (Map.Entry)(it.next());//Entry是Map接口内部类
    String key = (String)entry.getKey();//将取出的对象类型强制转换
    Integer value = (Integer)entry.getValue();
    System.out.println(key+"\t"+value);
}

Mybatis中updateByPrimaryKeySelective和updateByPrimaryKey的区别

逆向工程

1.updateByPrimaryKeySelective会进行判断然后在更新(如果是null忽略更新)适用于只想更新某个字段

2.updateByPrimaryKey是对注册的字段全部进行更新。user

Mybatis传递多个参数的解决办法

public User All(String name,String age){
    
}

sql:

select * from user where name=#{0} and age=#{1}

2.Map集合

public User all(Map paramMap){
    
}

sql

select * from user where name=#{userName,jdbcType=VARCHAR} and age=#{userAge,jdbcType=VARCHAR}

3.注解

public User all(@Param("userName")String name,@Param("userAge”)String age){
    
}

sql

select * user from where name=#{userName,jsbcType=VARCHAR} and age=#{userAge.jdbcType=VARCHAR}

Spring容器加载完成后执行的方法

使用Spring的listener中的onApplicationEvent()方法

数据库死锁

1.用户A访问A表(将A表锁住)有访问B表,用户B访问B表(将B表锁住),然后需要访问A表

解决方法:如果需要操作多表的时候,对按照表的顺序处理,先操作A在操作B

2.A查询(共享锁)了记录并进行了修改,B也对数据进行了修改(独立锁)

解决:对于按钮,可以使按钮点击后消失

​ 使用乐观锁,基于数据版本

​ 使用悲观锁,基于数据库锁机制

3.事务执行了一条不满足条件的update语句,则全表扫描,把行级锁上升为了表级锁,多个事务后会造成死锁,索引的创建过多或不合适

解决:sql语句不要太负责

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页