测试面试题集-MySQL数据库灵魂拷问

图片


1
什么是事务?mysql


事务是数据库操做的最小工做单元,是做为单个逻辑工做单元执行的一系列操做,这些操做做为一个总体一块儿向系统提交,要么都执行、要么都不执行,是一组不可再分割的操做集合。sql


通俗理解就是作一件事情的过程,事务封装了一条dml、或者多条dml语句。这个过程有两种结果:要么所有成功、要么所有失败。数据库




2
 什么是事务的ACID特性?
A=Atomicity ,原子性:事务是数据库最小逻辑单位。事务中包含的各项操做在一次执行过程当中,只容许出现两种状态之一,要么所有执行成功 ,要么所有执行失败。任何一项操做都会致使整个事务的失败,同时其它已经被执行的操做都将被撤销并回滚,只有全部的操做所有成功,整个事务才算是成功完成。
服务器

C=Consistency ,一致性:系统老是从一个一致性的状态转移到另外一个一致性的状态。例如从 A 帐户转帐到 B 帐户,不能由于 A 帐户扣了钱,而 B 帐户没有加钱,不管 A 和 B 怎么转帐,系统中总额是固定的。若是数据库系统运行中发生故障,有些事务还没有完成就被迫中断,这些未完成事务对数据库所作的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。cookie


I=Isolation ,隔离性: 一般来讲一个事务在彻底提交以前,对其余事务是不可见的。也就是说,不一样的事务并发操做相同的数据时,每一个事务都有各自完整的数据空间。一个事务内部的操做及使用的数据对其它并发事务是隔离的,并发执行的各个事务是不能互相干扰的。网络


D=Durability ,持久性:事务一旦提交,将永久存在,接下来的其它操做或故障不该该对其执行结果有任何影响。即便服务器系统崩溃或服务器宕机等故障。只要数据库从新启动,那么必定可以将其恢复到事务成功结束后的状态。session




3
 事务的隔离级别与对应的问题?
并发

MySQL 的隔离等级对加锁有影响,因此在分析具体加锁场景时,首先要肯定当前的隔离等级,分为如下几个等级:app

读未提交(Read Uncommitted ,简称 RU):能够读到未提交的读,基本上不会使用该隔离等级,因此暂时忽略。ide


读已提交(Read Committed ,简称 RC):存在幻读问题,对当前读获取的数据加记录锁。


可重复读(Repeatable Read ,简称 RR):不存在幻读问题,对当前读获取的数据加记录锁,同时对涉及的范围加间隙锁,防止新的数据插入,致使幻读。


序列化(Serializable):从 MVCC 并发控制退化到基于锁的并发控制,不存在快照读,都是当前读,并发效率急剧降低,不建议使用。


隔离级别与对应问题矩阵以下所示:

隔离级别
脏读
不可重复读
幻读
读未提交



不可重复读



可重复读


是(MySQL否)
串行化




注,常见数据库的默认级别:

  • MySQL 数据库的默认隔离级别是 Repeatable read (可重复读)级别。

  • Oracle数据库中,只支持 Seralizable(顺序读) 和 Read committed(读已提交)级别,默认的是 Read committed 级别。

  • SQL Server 数据库中,默认的是 Read committed(读已提交) 级别。




4
 MySQL是如何解决幻读的?

事务的隔离级别有4种:读未提交、读已提交、可重复读、串行化,关于在MySQL中InnoDB引擎是如何解决幻读,一张图甚过千言万语:

图片

综上,高并发数据库系统中,为保证事务与事务之间隔离性和数据一致性,MySQL InnoDB引擎默认是RR的隔离级别,在MySQL 中经过MVCC快照读和next-key(当前读)两种模式解决幻读问题。




5
 MySQL常见死锁场景有哪些?


  • 2个事务交叉:同一个事务中出现delete,insert操做;

  • 3个insert事务,一个回滚:三个事务的 insert 语句都是insert ignore into t1(a, b)values("1", "1");

  • 个事务,间隙锁形成死锁:同一个事务中多个update操做致使锁升级(行锁升级为表锁),并发操做时会致使死锁;


解决方式:事务拆分,同一个事物中不要出现锁升级,若是业务需求确实致使有表锁的出现,直接使用悲观锁。




6
 drop、delete与truncate的区别?

drop:drop是DDL,会隐式提交,因此,不能回滚,不会触发触发器;drop语句删除表结构及全部数据,并将表所占用的空间所有释放,底层系统文件会变小;drop语句将删除表的结构所依赖的约束,触发器,索引,依赖于该表的存储过程/函数将保留,可是变为invalid状态。


truncate:truncate是DDL,会隐式提交,因此,不能回滚,不会触发触发器;truncate会删除表空间,底层系统文件会变小。而且将从新设置高水线和全部的索引,缺省状况下将空间释放到minextents个extent,除非使用reuse storage。不会记录日志,因此执行速度很快,但不能经过rollback撤消操做,若是一不当心把一个表truncate掉,也是能够恢复的,只是不能经过rollback来恢复;对于外键(foreignkey )约束引用的表,不能使用 truncate table,而应使用不带 where 子句的 delete 语句;truncatetable不能用于参与了索引视图的表。


delete:delete是DML,执行delete操做时,每次从表中删除一行,而且同时将该行的的删除操做记录在redo和undo表空间中以便进行回滚(rollback)和重作操做,但要注意表空间要足够大,须要手动提交(commit)操做才能生效,能够经过rollback撤消操做;delete可根据条件删除表中知足条件的数据,若是不指定where子句,那么删除表中全部记录,只删表数据,删除操做后,底层系统文件不会变小;delete语句不影响表所占用的extent,高水线(high watermark)保持原位置不变。


总结:

  • 在速度上,通常来讲,drop> truncate > delete。

  • 在使用drop和truncate时必定要注意,虽然能够恢复,但为了减小麻烦,仍是要慎重。

  • 若是想删除部分数据用delete,注意带上where子句,回滚段要足够大;若是想删除表,用drop; 若是想保留表而将全部数据删除,若是和事务无关,用truncate便可;若是和事务有关,或者想触发trigger,仍是用delete; 若是是整理表内部的碎片,能够用truncate跟上reuse stroage,再从新导入/插入数据。



7
  谈谈对索引的理解?
  • 索引大大减少了服务器须要扫描的数据量;

  • 索引能够帮助服务器避免排序和临时表;

  • 索引能够将随机IO变成顺序IO


缺点:建立索引和维护索引要耗费时间,这种时间随着数据量的增长而增长;索引须要占物理空间,除了数据表占数据空间以外,每个索引还要占必定的物理空间,若是要创建聚簇索引,那么须要的空间就会更大;当对表中的数据进行增长、删除和修改的时候,索引也要动态的维护,这样就下降了数据的维护速度。



8
  哪些状况可能没法使用上索引?
  • 类型转换:当存在索引列的数据类型隐形转换,则用不上索引,好比列类型是字符串,那必定要在条件中将数据使用引号引用起来,不然不使用索引;

  • 索引列加函数:加了函数没法使用上索引;

  • 字符校对规则不对;




9
  一个查询语句只查询到一条记录,可是总在扫描数据库,试分析缘由?
  • 没有索引或者没有用到索引(这是查询慢最多见的问题,是程序设计的缺陷);

  • 没有建立计算列致使查询不优化;

  • 查询出的数据量过大(能够采用屡次查询或其余方法下降数据量);

  • 查询语句须要优化;




10
   若客户反馈系统慢,如何查找问题?

第一步: 查询应用服务器,数据库服务器 CPU使用率,CPU负载,带宽,内存;

第二步:通常是 CPU 太高,且是mysql进程,则进入数据库,首先查询活跃线程数,查询正在执行的sql,顺便也去慢查询日志文件;
第三步:找到问题sql,分析sql,经过explain分析具体问题(通常都是数据库有大量计算操做,大量数据查询返回没有作分页处理);
第四步:检查是否为网络问题。


往期内容宠幸


1. Python接口自动化-接口基础(一)

2.Python接口自动化-接口基础(二)


3.Python接口自动化-requests模块之get请求


4. Python接口自动化-requests模块之post请求

5.Python接口自动化之cookie、session应用


6.Python接口自动化之Token详解及应用


7.Python接口自动化之requests请求封装


8.Python接口自动化之pymysql数据库操做


9.Python接口自动化之logging日志


10.Python接口自动化之logging封装及实战

https://mp.weixin.qq.com/s/om7y0axd4ngQHL-rppLs7Q
相关文章
相关标签/搜索