-
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,进入后使用单步执行调试