您好,欢迎访问代理记账网站
移动应用 微信公众号 联系我们

咨询热线 -

电话 15988168888

联系客服
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

MySQL

MySQL

  • MySQL面试题
      • 1.简述数据库的三大范式
      • 2.简述MySQL的架构
      • 3.储存索引MyISAM与InnoDB的区别?
      • 3.简述执行SQL语言的过程
      • 4.SQL语句执行顺序
      • 5.并发控制
      • 6.行锁,表锁;悲观锁,乐观锁
      • 7.如何解决数据库死锁
      • 8.简述InnoDB存储引擎
      • 9.什么是MVCC?
      • 10.读提交和可重复读都基于MVCC实现,有什么区别?
      • 11.MySQL的事务特性
      • 12.InnoDB如何保证事务的原子性、持久性和一致性?
      • 13.
      • 7.
      • 7.
      • 7.
      • 7.
      • 7.
      • 7.
      • 7.
      • 7.
      • 7.
      • 7.
      • 7.
      • 7.
      • 7.
      • 7.

MySQL面试题

1.简述数据库的三大范式

  • 1NF:列唯一,不可再分。

  • 第一范式是最基本的范式。确保每列保持原子性;如果数据库表中的所有字段值都是不可分解的原子值,就说明该 数据库表满足了第一范式。

  • 2NF:属性完全依赖于主码(通过主码可以确定其他属性)

  • 第二范式(确保表中的每列都和主键相关);也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。

  • 。注意,符合第二
    范式的关系模型可能还存在数据冗余、更新异常等问题。关系模型(学号,姓名,专业编号,专业名称)中,学号->姓名,而专业编号->专业名称,不满足数据库第二范式

  • 3NF:非主属性不得传递依赖于主属性(一张表的非主属性和主属性不能同时出现在另一张表中)

  • 第三范式(确保每列都和主键列直接相关,而不是间接相关);

  • 接着以学生表举例,对于关系模型(学号,姓名,年龄,性别,所在院校,院校地址,院校电话)院校地址,院校电话和学号不存在直接关系,因此不满足第三范式。

2.简述MySQL的架构

  • MySQL可以分为应用层,逻辑层,数据库引擎层,物理层。

  • 应用层: 客户端向数据库发送请求,响应客户端请求,mysqlserver建立连接(连接器);

  • 逻辑层: 包括分析器(分析sql词法,语法),优化器(优化sql语句,规划执行流程 CBO,RBO),执行器(SQL语句的实际执行流程)。

  • 数据库引擎层: 有常见的MyISAM,InnoDB等等。

  • 物理层: 负责文件存储,日志等等。

3.储存索引MyISAM与InnoDB的区别?

对比项MyISAMInnoDB
外键不支持支持
事务不支持支持
行锁表表锁,即使操作一条记录也会锁住整个表,不适合高并发的操作行锁,操作时只锁某一行,不对其它行有影响,适合高并发的操作
缓存只缓存索引,不缓存真实数据不仅缓存索引还要缓存真实数据,对内存要求较高,而且内存大小对性能有决定性的影响
索引结构非聚集索引,使用B+Tree作为索引结构InnoDB是聚集索引,使用B+Tree作为索引结构
MyISAM支持全文索引Innodb不支持全文索引

InnoDB: DELETE 表时,是⼀行 ⼀行的删除;Inno DB 把数据和索引存放在表空间里面。
MyISAM:DELETE 表时,先drop表,然后重建表;My ISAM 表被存放在三个⽂٘件 。frm ⽂٘件存放表格定义。 数据⽂٘件是MYD (MYData) 。 索引⽂٘件是MYI (MYIndex)引伸;

如何选择:
1. 是否要支持事务,如果要请选择innodb,如果不需要可以考虑MyISAM;
2. 如果表中绝大多数都只是读查询,可以考虑MyISAM,如果既有读也有写,请使用InnoDB。
3. 系统奔溃后,MyISAM恢复起来更困难,能否接受;
4. MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的,如果你不知道用什么,那就用InnoDB,至少不会差。

innodb引擎的4大特性

  1. 插入缓冲(insert buffer)
  2. 二次写(double write)
  3. 自适应哈希索引(ahi)
  4. 预读(read ahead)

3.简述执行SQL语言的过程

  1. 客户端首先通过连接器进行身份认证和权限相关;
  2. 如果是执行查询语句的时候,会先查询缓存,但MySQL 8.0 版本后该步骤移除;
  3. 没有命中缓存的话,SQL 语句就会经过解析器,分析语句,包括语法检查等等;
  4. 通过优化器,将用户的SQL语句按照 MySQL 认为最优的方案去执行;
  5. 执行语句,并从存储引擎返回数据。

4.SQL语句执行顺序

from : 指定数据来源表
where: 对查询数据做第一次过滤
group by:分组
having: 对分组后的数据做二次过滤
select: 查询各字段的值
order by: 顺序
limit:限定查询结果

5.并发控制

当程序中可能出现并发的情况时,就需要保证在并发情况下数据的准确性,以此确保当前用户和其他用户一起操作时,所得到的结果和他单独操作时的结果是一样的。这就叫做并发控制并发控制的目的是保证一个用户的工作不会对另一个用户的工作产生不合理的影响。
没有做好并发控制,就可能导致脏读、幻读和不可重复读等问题

实现并发控制的主要手段分为乐观并发控制悲观并发控制两种。

6.行锁,表锁;悲观锁,乐观锁

  • 行锁: 数据库的某一行被锁住;

  • 如果表存在索引,那么记录锁是锁在索引上的,如果表没有索引,那么 InnoDB 会
    创建一个隐藏的聚簇索引加锁。

  • 行级锁能大大减少数据库操作的冲突。其加锁粒度最小,并发度高,但加锁的开销也最大,加锁慢,会出现死锁。

  • 表锁: 整个数据库表被锁住;

  • 悲观锁: 当要对数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是在他人修改数据之前直接对该数据进行加锁以防止并发。这种借助数据库锁机制,在修改数据之前先锁定,再修改。这种被称为悲观并发控制,又“悲观锁”。

悲观锁,具有强烈的独占和排他特性。它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度。因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制.

之所以叫做悲观锁,是因为这是一种对数据的修改持有悲观态度的并发控制方式。总是假设最坏的情况,每次读取数据的时候都默认其他线程会更改数据,因此需要进行加锁操作,当其他线程想要访问数据时,都需要阻塞挂起

传统的关系型数据库使用这种锁机制
比如行锁、表锁、读锁、写锁等,都是在操作之前先上锁
Java 里面的同步 synchronized 关键字的实现

悲观锁主要分为共享锁和排他锁:
共享锁【shared locks】又称为读锁,简称 S 锁。顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改
排他锁【exclusive locks】又称为写锁,简称 X 锁。顾名思义,排他锁就是不能与其他锁并存,如果一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁。获取排他锁的事务可以对数据行读取和修改。

悲观并发控制实际上是“先取锁再访问”的保守策略,为数据处理的安全提供了保证。但是在效率方面,处理加锁的机制会让数据库产生额外的开销,还有增加产生死锁的机会。另外还会降低并行性,一个事务如果锁定了某行数据,其他事务就必须等待该事务处理完才可以处理那行数据。

  • 乐观锁: 乐观锁假设数据一般情况不会被别人修改,所以在数据进行提交更新update的时候,才会正式对数据的冲突与否进行检测,如果冲突,则返回给用户异常信息,让用户决定如何去做。乐观锁适用于读多写少的场景,这样可以提高程序的吞吐量。

乐观锁采取了更加宽松的加锁机制。也是为了避免数据库幻读、业务处理时间过长等原因引起数据处理错误的一种机制,但乐观锁不会刻意使用数据库本身的锁机制,而是依据数据本身来保证数据的正确性.

具体实现是给表增加⼀个版本号的字段,在执⾏update操作时比较该版本号是否与当前数据库中版本号⼀致,如⼀致,更新数据,反之拒绝。

  • **Gap 锁:**也称为间隙锁: 锁定一个范围但不包括记录本身。其目的是为了防止同一事物的两次当前读出现幻读的情况。

7.如何解决数据库死锁

  1. 预先检测到死锁的循环依赖,并立即返回一个错误。
  2. 当查询的时间达到锁等待超时的设定后放弃锁请求。

8.简述InnoDB存储引擎

  • InnoDB 是 MySQL 的默认事务型引擎,支持事务,表是基于聚簇索引建立的。支持表级锁和行级锁,支持外键,适合数据增删改查都频繁的情况。
  • InnoDB 采用 MVCC 来支持高并发,并且实现了四个标准的隔离级别。其默认级别是 REPEATABLE READ,并通过间隙锁策略防止幻读,间隙锁使 InnoDB 不仅仅锁定查询涉及的行,还会对索引中的间
    隙进行锁定防止幻行的插入。

9.什么是MVCC?

  • MVCC为多版本并发控制,即同一条记录在系统中存在多个版本。其存在目的是在保证数据一致性的前提下提供一种高并发的访问性能。对数据读写在不加读写锁的情况下实现互不干扰,从而实现数据库的隔离性,在事务隔离级别为读提交和可重复读中使用到。
  • 在InnoDB中,事务在开始前会向事务系统申请一个事务ID,该ID是按申请顺序严格递增的。每行数据具有多个版本,每次事务更新数据都会生成新的数据版本,而不会直接覆盖旧的数据版本。数据的行结构中包含多个信息字段。其中实现MVCC的主要涉及最近更改该行数据的事务ID(DB_TRX_ID)和可以找到历史数据版本的指针(DB_ROLL_PTR)。
  • InnoDB在每个事务开启瞬间会为其构造一个记录当前已经开启但未提交的事务ID的视图数组。通过比较链表中的事务ID与该行数据的值与对应的DB_TRX_ID,并通过DB_ROLL_PTR找到历史数据的值以及对应的DB_TRX_ID来决定当前版本的数据
    是否应该被当前事务所见。最终实现在不加锁的情况下保证数据的一致性。

10.读提交和可重复读都基于MVCC实现,有什么区别?

  • 在可重复读级别下,只会在事务开始前创建视图,事务中后续的查询共用一个视图。而读提交级别下每个语句执行前都会创建新的视图。因此对于可重复读,查询只能看到事务创建前就已经提交的数据。而对于读提交,查询能看到每个语句启动前已经提交的数据。

11.MySQL的事务特性

12.InnoDB如何保证事务的原子性、持久性和一致性?

  • 利用undo log保障原子性。该log保存了事务发生之前的数据的一个版本,可以用于回滚,从而保证事务原子性。
  • 利用redo log保证事务的持久性,该log关注于事务的恢复.在重启mysql服务的时候,根据redo log进行重做,从而使事务有持久性。
  • 利用undo log+redo log保障一致性。事务中的执行需要redo log,如果执行失败,需要undo log 回滚。

13.

7.

7.

7.

7.

7.

7.

7.

7.

7.

7.

7.

7.

7.

7.


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进