数据库常见问题(9问)
1、比较Innodb和Myisam引擎的区别
(1)事务
Innodb支持事务,Myisam不支持事务
(2)存储
每个MyISAM在磁盘上存储成三个文件。
1)frm-------表格定义
2)MYD(MYData)--------数据文件
3)MYI(MYIndex)--------索引文件
而Innodb所有的表都保存在同一个数据文件中。 InnoDB表的大小只受限于操作系统文件的大小,一般为2GB
(3)锁
Myisam支持表级锁,Innodb支持行级锁
(4)表主键
Myisam允许没有任何索引和主键的表存在,索引都是保存行的地址。
Innodb如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。
(5)外键
Myisam不支持外键,Innodb支持外键
(6)效率
执行大量SELECT操作时,使用Myisam更好
执行大量INSERT或UPDATA时,使用Innodb性能更好
在清空整个表时,Innodb是一行一行的删除,效率非常慢。Myisam则会重建表
2、描述MVCC
MVCC(Multiversion Concurrency Control)多版本并发控制,可以保证读和写之间不会有锁竞争,提高性能。
MVCC的目的是让不同的事务都能运行在各自的快照版本数据下而不互相阻塞,即写操作可以生成新版本数据,读操作仍然能够读到旧的版本
主要针对的隔离级别是读已提交和可重复读
Innodb下的当前读
它读取数据库记录,都是当前最新的版本,会对当前读取的数据进行加锁,防止其他事务修改数据,是悲观锁的一种操作
以下操作都是当前读:
select lock in share mode(共享锁)
select for update(排他锁)
update(排他锁)
insert(排它锁)
delete(排它锁)
快照读的实现是基于MVCC的
数据库共有四种隔离级别:
(1)读未提交
(2)读已提交
(3)可重复度
(4)串行化
常用的是(2)和(3)
undo log--------日志
roll pointer--------回滚指针,指向前一个历史版本
readview---------快照,用于知道在版本链中选择哪一条记录
trx id----------事务ID(自增)
3、事务的四大特性是什么?请分别描述
(1)原子性
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚(使用undo log)
(2)持久性
持久性是指一个事务一旦被提交,其对数据库中数据的改变是永久性的(使用redo log)
(3)隔离性
隔离性是指,当多个用户并发访问数据库时,某一个事务执行的操作不会被其他事务所影响,多个并发事务之间要相互隔离(通过加锁和MVCC来实现)
(4)一致性
一致性是指事务必须从一个一致性状态变换到另一个一致性状态,即一个事务执行前后都必须处于一致性状态
4、mysql的索引的底层树结构,为什么使用此种结构?
mysql的索引底层使用的是B+树。
B+树将所有的非叶子节点的索引都存放在叶子节点,每个叶子结点都有指向相邻叶子结点的指针。这样当进行大量查询操作时,可以大大减少对磁盘的 I/O 操作
5、Innodb和MyIsam的B+树实现有什么不同?
MYISAM中叶子节点的数据区域存储的是数据记录的地址。MyISAM存储引擎在使用索引查询数据时,会先根据索引查找到数据地址,再根据地址查询到具体的数据。
InnoDB中主键索引的叶子节点的数据区域存储的是数据记录,辅助索引存储的是主键值。
Innodb中的主键索引和实际数据时绑定在一起的,也就是说Innodb的一个表一定要有主键索引,如果一个表没有手动建立主键索引,Innodb会查看有没有唯一索引,如果有则选用唯一索引作为主键索引,如果连唯一索引也没有,则会默认建立一个隐藏的主键索引(用户不可见)。另外,Innodb的主键索引要比MyISAM的主键索引查询效率要高(少一次磁盘IO),并且比辅助索引也要高很多。
————————————————
原文链接:https://blog.csdn.net/z2516305651/article/details/100107560
6、简述聚簇索引和非聚簇索引的区别,Innodb使用哪种索引?
聚簇索引:将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据
非聚簇索引:将数据与索引分开存储,索引结构的叶子节点指向了数据对应的位置
InnoDB使用的是聚簇索引,将主键组织到一棵B+树中,而行数据就储存在叶子节点上,
7、描述更新一行数据的过程
InnnoDB 的数据都是放在磁盘上的,InnoDB 操作数据有一个最小的逻辑单位,叫做页(索引页和数据页)。我们对于数据的操作,不是每次都直接操作磁盘,因为磁盘的速度太慢了。InnoDB 使用了一种缓冲池的技术,也就是把磁盘读到的页放到一块内存区域里面。这个内存区域就叫 Buffer Pool。
下一次读取相同的页,先判断是不是在缓冲池里面,如果是,就直接读取,不用再次访问磁盘。
修改数据的时候,先修改缓冲池里面的页。内存的数据页和磁盘数据不一致的时候,我们把它叫做脏页。InnoDB 里面有专门的后台线程把 Buffer Pool 的数据写入到磁盘,每隔一段时间就一次性地把多个修改写入磁盘,这个动作就叫做刷脏。
作者:三个石头_260a
链接:https://www.jianshu.com/p/d529adb67e10
来源:简书
8、描述jdbc开发的基本流程
1、注册驱动
2、获取数据库的连接
3、获取statement对象
4、执行sql语句
5、从ResultSet对象中获取相应的数据
6、关闭
9、简述数据表设计的三大范式
1、原子性
即:字段不可再拆分
数据库表的每一列都是不可分割的原子数据项,而不能是集合、数组等非原子数据项
2、主键唯一性
数据库表中的每一个实例或记录必须可以被唯一的区分
选取一个能区分每个实体的属性或属性组,作为实体的唯一标识
即:保证两行不重复
可以采用主键策略(主键可设为自增长)
3、非主依赖
字段只能依赖于主键,不能依赖于非主键