一. 什么是数据库事务?

事务是数据库并发控制的单位,在事务中的操作,要么都执行,要么都不执行。

二. 事务的四大特性介绍一下(ACID)

  • 原子性:在事务中的操作,要么都执行,要么都回滚。
  • 一致性:在事务操作前后,不改变数据的完整性。
  • 隔离性:在并发访问数据库时,不同事物之间是相互不干扰的。
  • 持久性:当事务提交完成,该事务对数据库的操作是永久的。

**

三. 什么是脏读?幻读?不可重复读?

  • 脏读:当前事务读到其他事务中未提交的数据。
  • 不可重复读:在一个事务中的两次相同的查询得到的数据前后不一致。
  • 幻读:在一个事务中,进行两次相同的查询,第二次查询得到第一次没有的记录或者得到的记录比第一次查询的要少。


四. 说一下MySQL的事务隔离机制?

安全性由低到高

  1. 读取未提交:可以读取其他事务中未提交的数据。会出现脏读、不可重复读、幻读。
  2. 读取已提交:只能读取其他事务已经提交的数据。可以防止脏读,但是还是会出现不可重复读和幻读。
  3. 可重复读:在一个事务中两次相同查询,数据一致。可以防止脏读和不可重复读。会出现幻读。
  4. 串行化:事务只能轮流访问数据库。可以防止一切脏读、不可重复读、幻读。

五. 谈一下MySQL的锁机制? / MySQL中有哪几种锁?/ InnoDB锁机制?

InnoDB锁机制是为了保证数据一致性,不同的引擎有不同的锁机制。
Mysql:支持行锁、表锁、页锁、记录锁等。

  1. 行锁:上锁满、效率低、但是并发率高。对需要操作的数据进行上锁,可以锁住多行记录。
  2. 表锁:上锁快、效率高、但是并发率低。对表上锁。
  3. 页锁:介于表锁和行锁之间。对页上锁。
  4. 记录锁:只能所住某一条记录。

**

六. 说一下悲观锁和乐观锁?

悲观锁:每次都是想到最坏的情况,我要操作的数据,别人也想操作。然后我就上锁,不让别人操作。在多线程中性能低下。
乐观锁:每次都是想到最好的情况,我要操作的数据,别人都不操作。不上锁,利用CAS完成对数据的原子更新。
并发率高,性能高。

七. 隔离级别和锁有什么关系?

  • 读未提交不会加锁,
  • 读已提交,会对查询的数据加共享锁,对需要操作的记录加排他锁。
  • 可重复读对获取的数据加排他锁。
  • 串行化:对表加排他锁。


八. 什么是死锁?怎么解决?

多个线程对临界资源进行访问,假如说有4台打印机,每个线程需要3台才能工作,但是当前的话有两个线程,一人获得2台打印机资源。然后都不主动释放,则造成死锁。
解决办法:设置获得锁的超时时间,一旦超时主动释放资源和锁。

九. 什么是MVCC?

MVCC代表多版本并发控制,最大的优势是读写不冲突。增加系统的并发性能。
原理是会新增一个version字段,当对数据进行操作时,会读取version和数据,当修改好写回数据库时,version会+1;然后去与数据库当前的version进行比较,如果我的version>数据库的version,则进行写入。否则数据库认为我的数据时过期数据,拒绝写入数据库。
**

十. UndoLog RedoLog BinLog的区别?(重点)

UndoLog:撤销日志,用来备份旧数据。undolog在每次事务开始之前会保存一个副本,如果事务发生回滚或者数据库崩溃,则使用undoLog让数据库恢复到事务发生前的状态。
RedoLog:重做日志,事务中修改数据时,会把最新的数据存入RedoLog中。当发生脏页使数据回滚时,可以使用RedoLog进行重做。
**

十一. MyISAM和InnoDB的区别?(重点)

  1. MyISAM不支持事务和外键,提供高速的检索操作,适合大量查询操作。
  2. InnoDB支持事务和外键,适合插入和更新。
  3. MyISAM只支持表锁,锁定整张表,会发生读写阻塞,并发效率低。可以通过MVCC来支持高并发。
  4. InnoDB支持行锁,基于对索引加锁实现的,读写阻塞与隔离级别有关。


十二. SQL执行策略Explain(重点)

EXPLAIN SELECT AGE FROM STUDENT WHERE AGE<20;
force index(index_name) 可以强制走索引。
会显示该查询语句的执行策略,其中有很多关键字。

  1. id:表示语句的优先级。
  2. key:如果为NUll则没走索引。否则走了相应的索引。
  3. key_len:根据key_len的值,可以计算出来走了几个索引。
  4. type:system > const > eq_ref > ref > range > index > ALL
  5. rows:需要检测的行数(注:不是结果集行数)。
  6. Extre:额外信息。

十三. 有没有使用过trace工具(重点)

trace 用过几次,我是用来看对查询语句的解析。比如可以看到const,也就是执行成本,其中会显示,全盘扫描的成本,走索引的成本,然后进行比较选择一个最优的。然后执行。

十四. 数据库三大范式

**
第一范式:列的不可再分性。
第二范式:所有非主键字段必须依赖与主键字段。
第三范式:不能有依赖传递,比如主键A,字段B,字段C。B与C之间不能有依赖。

十五. 慢查询知道吗?

MySQL的慢查询,全名是慢查询日志,是MySQL提供的一种日志记录,用来记录在MySQL中响应时间超过阀值的语句。

十六.单路排序和双路排序知道吗?

单路排序,和双路排序都是filesort中的。

  1. 单路排序:把查询的数据全部取出来,放入sortBuff中,进行排序。
  2. 双路排序:把需要排序的字段和可以直接定位行的id取出来,放入sortBuff中进行排序,最后回表拿数据。


trace工具**
sort_mode信息里显示< sort_key, additional_fields >或者< sort_key, packed_additional_fields >表示使用单路排序。
sort_mode信息里显示< sort_key, rowid >表示使用双路排序。