Java面试技术栈(三):数据库 Mysql & Oracle (SQL 优化 和 存储过程)

  • MySQL

Q1 : MYSQL 事务隔离级别

1.读未提交(read-uncommitted)

    可读到未提交的数据,如果发生回滚操作,则会导致脏读(要避免脏读,可设置)

2.不可重复读(read-committed)

    不可以获取未提交的数据,避免的脏读,但是数据前后两次获取可能会出现结果不一致的情况(中间有其他客户端提交了数据),如果要避免不可重复读,则可以设置,可重复读

3.可重复读(repeatable-read)(默认)

    SELECT操作获取数据,不会更新版本号,而insert、update、delete操作则会更新版本号

    客户端A select 数据,读到的是n = 100,

    客户端B select 数据,读到的是n = 100,

    此时A和B都需要更新数据,A提交了n = n+50,B提交了n = n+50 。  最终的结果n = 100+50+50   = 200

4.串行化(serializable)

Q2:数据库事务特性:ACID 原子性,一致性,隔离性,持久性

MYSQL执行计划

选中sql,右击explain ,查看type列,如果是ALL则说明全表查询了。

Q3.SQL 优化点:

1.查询具体所需要的列,代替select * from

2.使用关联查询left join ,right join, inner join 代替 子查询

3.exists ,notexists 代替 in ,not in

4.or 的查询 尽量用union 或者union all 代替

5.避免在where 中使用 != 或者 <> 

6.避免在where中使用null 判断,所以在设计中,可以使用0值替代null从而进行空值判断

7.避免like条件中,在前面"%aaaa",前面加%查询会走全表查询

Q4.如何给已经存在的大数据量的表加索引:

1.备份,create table new_table like old_table;

2.新表new_table中添加字段,创建索引:

ALTER TABLE `table_name` ADD COLUMN `num` int(10) NOT NULL DEFAULT 0 AFTER `addtime`;

ALTER TABLE `table_name` ADD INDEX `num` (`num`);

3.复制旧表的数据到新表

insert into new_table(column1,column2,column3...) select column1,column2,column3... from old_table;

4.修改表名字

Q5:行锁

MYISAM引擎:只支持表级锁

INNODB引擎:支持行级锁(共享锁,排他锁),支持事务;设计余额变更时使用

Q6.索引类型,应如何判断使用哪种索引

索引分为:聚集索引或非聚集索引

聚集索引。每个表只能有一个,通常应该在经常在Where条件中建立索引

Q7.存储过程

调试存储过程:右键test,进入后使用单步执行调试

猜你喜欢

转载自blog.csdn.net/fengj20015/article/details/108270688