当前位置:   article > 正文

MySQL面经整理_myaql面经

myaql面经

在这里插入图片描述

1、数据库的常用引擎

  • InnoDB(默认)

  • Myisam

  • Memory

2、InnoDB和MyISAM的区别

在这里插入图片描述

  1. InnoDB和Myisam的默认索引都是B+tree,不同的是MyISAM的B+树叶子节点存放的是数据的磁盘地址,InnoDB的B+树叶子节点存放的是完整的数据记录

  2. InnoDB支持事务、外键、2种锁(行锁(默认)、表锁),写入操作快,Mysql5.6版本以上才支持全文索引(全文索引不支持中文)

  3. MyISAM支持表锁,不支持行锁

  4. 如果没有显示在表定义时指定主键,InnoDB会选择第一个可以唯一标识数据记录的列作为主键索引,如果不存在这种列,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键

  5. Myisam不支持事务、外键,支持表锁、全文索引,写入、读取速度快

    每个MyISAM类型的表都有一个AUTO_INCREMENT的内部列

  6. InnoDB一张表两个本地文件(.frm、.idb)MyISAM一张表三个本地文件(.frm、.MYI、.MYD)

Memory的默认索引是hash

Memory所有的数据都保留在内存中,不需要进行磁盘的IO所以读取速度快,

但是一旦关机的话表的结构会保留但是数据会丢失,表支持Hash索引,因此查找速度很快

3、Mysql的事务隔离级别

事务具有四个特征(ACID):

原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )、持久性( Durability )。

隔离级别
  1. Read Uncommitted(读未提交)–脏读

    在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。

  2. Read Committed(读已提交)–不可重复读

    这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。

  3. Repeatable Read(可重复读)–幻读

    这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。

  4. Serializable(串行化)

    这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

幻读和不可重复读的区别:
  • 不可重复读的重点是修改:在同一事务中,同样的条件,第一次读的数据和第二次读的数据不一样。(因为中间有其他事务提交了修改)
  • 幻读的重点在于新增或者删除:在同一事务中,同样的条件,,第一次和第二次读出来的记录数不一样。(因为中间有其他事务提交了插入/删除)

4、如何保证mysql的原子性和持久性?

  • 利用redo_log日志保证mysql的持久性

  • 利用undo_log保证系统的原子性

  • 隔离性通过锁

  • 一致性:是通过事务的原子性、隔离性、持久性共同保证的

    一致性是事务的根本追求

5、MySQL是怎么解决幻读的?

5.1、MVCC

InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的,这两个列,分别保存了这个行的· 创建版本号,一个保存的是行的删除版本号(可以理解为事务的ID),每开始一个新的事务,系统版本号就会自动递增,事务开始时刻的系统版本号会作为事务的ID

SELECT (version)

  • 读取创建版本小于或等于当前事务版本号,并且删除版本为空或大于当前事务版本号的记录。这样可以保证在读取之前记录是存在的。version >= createVersion and version < deleteVersion

INSERT (createVersion)

  • 将当前事务的版本号保存至行的创建版本号。 createVersion = version

UPDATE (createVersion)

  • 新插入一行,并以当前事务的版本号作为新行的创建版本号,同时将原记录行的删除版本号设置为当前事务版本号。 新行createVersion = version,旧行deleteVersion = version

DELETE (deleteVersion)

  • 将当前事务的版本号保存至行的删除版本号。 deleteVersion = version
5.2、间隙锁

6、MySql的锁分类
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/663428

推荐阅读
相关标签