MySql教程

Mysql的⑨道题目,可以了解下哦~

本文主要是介绍Mysql的⑨道题目,可以了解下哦~,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

mysql 9道问答题:

      • 1. Innodb和Myisam引擎的区别。
      • 2. 描述MVCC。
      • 3. 事务的四大特性是什么。
      • 4. mysql的索引的底层树结构,为什么使用此种结构?
      • 5.Innodb和MyIsam的B+树实现有什么不同?
      • 6.简述聚簇索引和非聚簇索引的区别,Innodb使用哪种索引?
      • 7. 描述更新一行数据的过程。
      • 8. 描述jdbc开发的基本流程。
      • 9. 简述数据表设计的三大范式

1. Innodb和Myisam引擎的区别。

  • InnoDB支持事务,MyISAM不支持。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了。
  • MyISAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用
  • InnoDB支持外键MyISAM不支持
  • InnoDB中不保存表的行数,Myisam保存表的行数,如select count(* ) from table时,在全查询统计行数时,InnoDB需要扫描一遍整个表来计算有多少行,而Myisam直接就可以返回结果。
  • 对于自增长的字段InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引
  • 清空整个表时,InnoDB是一行一行的删除,效率非常慢。MyISAM则会重建表
  • InnoDB支持行锁

2. 描述MVCC。

MVCC(Multiversion Concurrency Control) 多版本并发控制:
通过数据行的多个版本管理来实现数据库的并发控制,保存数据的历史版本,通过比较版本号决定数据是否显示出来。读取数据的时候不需要加锁可以保证事务的隔离效果。

过程:
MVCC流程
优点:

  • 通过 MVCC 可以让读写互相不阻塞,读不阻塞写,写不阻塞读,这样可以提升数据并发处理能力
  • 降低了死锁的概率,这个是因为 MVCC 采用了乐观锁的方式,读取数据时,不需要加锁,写操作,只需要锁定必要的行。
  • 解决了一致性读的问题,当我们朝向某个数据库在时间点的快照读(不加锁的简单Select都属于快照读),只能看到这个时间点之前事务提交更新的结果,不能看到时间点之后事务提交的更新结果。

3. 事务的四大特性是什么。

ACID:

1.原子性(Atomicity):事务中包含的所有操作要么都做,要么都不做,保证数据库是一致的。
2. 一致性(Consistency):数据库中的数据在事务操作前和事务处理后都必须满足约束。事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
3. 隔离性(Isolation):事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离
4. 持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

4. mysql的索引的底层树结构,为什么使用此种结构?

mysql索引底层结构采用的是B+树:

B树:通过将二叉树改为多路平衡查找树,解决了树过高的问题;
B+树:在B树的基础上,将非叶节点改造为不存储数据的纯索引节点,进一步降低了树的高度;此外将叶节点使用指针连接成链表,范围查询更加高效。

B+树的优点:

  • 更少的IO次数:B+树的非叶节点只包含键,而不包含真实数据,因此每个节点存储的记录个数比B数多很多(即阶m更大),因此B+树的高度更低,访问时所需要的IO次数更少。此外,由于每个节点存储的记录数更多,所以对访问局部性原理的利用更好,缓存命中率更高。
  • 更适于范围查询:在B树中进行范围查询时,首先找到要查找的下限,然后对B树进行中序遍历,直到找到查找的上限;而B+树的范围查询,只需要对链表进行遍历即可。
  • 更稳定的查询效率:B树的查询时间复杂度在1到树高之间(分别对应记录在根节点和叶节点),而B+树的查询复杂度则稳定为树高,因为所有数据都在叶节点。

5.Innodb和MyIsam的B+树实现有什么不同?

请添加图片描述
请添加图片描述

  • MYISAM中叶子节点的数据区域存储的是数据记录的地址
  • InnoDB中主键索引的叶子节点的数据区域存储的是数据记录辅助索引存储的是主键值

6.简述聚簇索引和非聚簇索引的区别,Innodb使用哪种索引?

Innodb使用聚簇索引。

聚簇索引:树的叶节点data域保存了完整的数据记录
非聚簇索引:将数据与索引分开存储,索引结构的叶子节点data指向了数据对应的位置,然后以data域的值为地址,读取相应数据记录。

7. 描述更新一行数据的过程。

一个表除了本身字段外还有隐藏字段。

  • ROW_ID: 隐藏的行ID,用来生成默认的聚簇索引。
  • DB_TRX_ID: 操作这个事务的ID,也就是最后一个对数据插入或者更新的事务-.
  • DB_ROOL_PTR: 回滚指针,指向这个记录的Undo Log信息。

在这里插入图片描述
过程:
在这里插入图片描述

  • redo log就是将执行的SQL语句保存到一个指定的Log文件,当Mysql执行恢复时重新执行redo log记录的SQL操作即可。当客户端执行每条SQL(更新语句)时,redo log会被首先写入log buffer;当客户端执行COMMIT命令时,log buffer中的内容会被视情况刷新到磁盘。redo log在磁盘上作为一个独立的文件存在,即Innodb的log文件。
  • undo log是为回滚而用,具体内容就是copy事务前的数据库内容(行)到undo buffer,在适合的时间把undo buffer中的内容刷新到磁盘。undo buffer与redo buffer一样,也是环形缓冲,但当缓冲满的时候,undo buffer中的内容会也会被刷新到磁盘;

8. 描述jdbc开发的基本流程。

(1)加载驱动:

Class.forname(com.mysql.cj.driver);

(2)创建连接

final String URL="jdbc:mysql://localhost:3306/数据库名称?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
final String USERNAME="用户名";
final String PASSWORD="密码";
Connection conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);

(3)获取PreparedStatment执行对象(Statment对象会造成“SQL注入漏洞“问题)

 PreparedStatement pst= conn.prepareStatement(sql);//执行的sql语句
 pst.executeUpdate();//增删改操作,无返回值
 ResultSet rs = pst.executeQuery()//查找操作,有返回值

(4)关闭连接

if(rs!=null) rs.close();
if(pst!=null) st.close();
if(conn!=null) conn.close();

9. 简述数据表设计的三大范式

  1. 第一范式:所有的字段都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。实体中的某个属性有多个值时,必须拆分为不同的属性。
  2. 第二范式:主键策略。即数据库表中的每个实例或记录必须可以被唯一地区分。选取一个能区分每个实体的属性或属性组,作为实体的唯一标识。(例如身份证就是人的主键,一个身份证对应一个人)
  3. 第三范式:非主依赖。在第二范式基础上,任何非主属性不依赖于其它非主属性,所有非主属性应该和主键依赖
这篇关于Mysql的⑨道题目,可以了解下哦~的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!