Mysql的⑨道题目,可以了解下哦~
2021/7/23 2:06:09
本文主要是介绍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 采用了乐观锁的方式,读取数据时,不需要加锁,写操作,只需要锁定必要的行。
- 解决了一致性读的问题,当我们朝向某个数据库在时间点的快照读(不加锁的简单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. 简述数据表设计的三大范式
- 第一范式:所有的字段都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。实体中的某个属性有多个值时,必须拆分为不同的属性。
- 第二范式:主键策略。即数据库表中的每个实例或记录必须可以被唯一地区分。选取一个能区分每个实体的属性或属性组,作为实体的唯一标识。(例如身份证就是人的主键,一个身份证对应一个人)
- 第三范式:非主依赖。在第二范式基础上,任何非主属性不依赖于其它非主属性,所有非主属性应该和主键依赖。
这篇关于Mysql的⑨道题目,可以了解下哦~的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-04部署MySQL集群项目实战:新手入门教程
- 2024-11-04如何部署MySQL集群资料:新手入门指南
- 2024-11-02MySQL集群项目实战:新手入门指南
- 2024-11-02初学者指南:部署MySQL集群资料
- 2024-11-01部署MySQL集群教程:新手入门指南
- 2024-11-01如何部署MySQL集群:新手入门教程
- 2024-11-01部署MySQL集群学习:新手入门教程
- 2024-11-01部署MySQL集群入门:新手必读指南
- 2024-10-23BinLog入门:新手必读的MySQL二进制日志指南
- 2024-10-23Binlog入门:MySQL数据库的日志管理指南