事务
四大特性(ACID)
- 原子性:一个事务中的操作要么全部完成,要么全部不完成,事务如果执行错误了,会被回滚。
- 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这里可以举一个字段不能为null,结果却不填写。
- 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力。事务隔离分为不同级别,包括未提交读(Read uncommitted)、提交读(read committed)、可重复读(repeatable read)和串行化(Serializable)。
- 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
事务的隔离级别
- Read uncommitted 读未提交:
id =1 的areaname=“重庆”,事务A update area set areaname=“成都” where id=1,但还没有commit,事务B select areaname where id=1,读到了成都。 - Read Commited 读已提交:
id =1 的areaname=“重庆”,事务A update area set areaname=“成都” where id=1,但还没有commit,事务B select areaname where id=1,读到了重庆。 (因为事务A还没有提交事务A提交之后,就可以读到成都) - Repeatable Reads 可重复读
id =1 的areaname=“重庆”,事务A update area set areaname=“成都” where id=1,commit之后,事务B select areaname where id=1,读的还是重庆。 (因为事务B还没有提交事务B提交之后,下一个事务读到的id=1的areaName就是重庆) - Serializable 串行化
索引
为什么要使用索引:避免全表扫描,提升查找效率
两种索引:HashMap和B树,B+树。索引存放在硬盘中。
一个关于索引优化–最佳左前缀法则的深度好文
https://mp.weixin.qq.com/s/pmXU9q3m1COibOXsEvIGzQ
B树
- B树种所有结点孩子结点个数的最大值称为B-树的阶,通常用m表示。
- 每个结点最多有m个分支,如果是根节点且不是叶子结点,至少有两个分支,非根非叶子结点至少有ceil(m/2)个分支。每个结点的结构如下图所示。
- 叶结点处于同一层,可以用空指针表示,是查找失败到达的地方。
密集索引和稀疏索引:
- 密集索引:文件中的每个搜索码值都有一个索引项。
- 稀疏索引:只为搜索码的某些值建立索引项。只有当关系按搜索码排列顺序存储时才能使用稀疏索引。
InnoDB和MyISAM区别
功能上的区别
来源https://kinsta.com/knowledgebase/convert-myisam-to-innodb/
- InnoDB:行级锁,MyISAM:只有表级锁
- InnoDB支持外键约束,MyISAM不支持。
- InnoDB支持事务,(可以commit还有roll back),MyISAM不支持
- InnoDB is more reliable as it uses transactional logs for auto recovery. MyISAM does not.
- InnoDB要求表必须有主键(如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键),MyISAM可以没有主键。
MyISAM与innoDB的存储上的区别:
MyISAM:每个MyISAM在磁盘上存储成三个文件。
(1).frm 用于存储表的定义。(2).MYD 用于存放数据。(3).MYI 用于存放表索引
InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。
MyISAM和InnoDB用的都是B+树,两者的叶子结点不一样:
myISAM的叶子结点存储的是记录的地址,而InnoDB的表数据文件本身就是一个按照B+树组织的一个索引结构,这个索引是数据表的主键,叶子结点的data域存储了完整的数据记录。
详细见https://blog.csdn.net/donghaixiaolongwang/article/details/60751543
应用场景
MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。
InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。
聚集索引和非聚集索引
MyISAM的索引方式是非聚集的,InnoDB的主键索引是聚集索引,InnoDB的表只能有一个聚集索引。聚集索引的键值的逻辑顺序决定了表中相应行的物理顺序,非聚集索引没有决定(对这个说法存疑)。
聚集索引,B+数的叶子节点存的是整行数据,直接通过这个聚集索引的键值找到某行。
面试问题
- 介绍一下关系型数据库的理论基础(关系代数,范式)
- 给定一个场景,设计表结构
- 给定表结构,按要求写出SQL语句
- 什么是事务的ACID属性?事务有哪些隔离级别?
- 事务的性能太慢怎么办?(乐观锁)
- 数据库索引的作用:
加快查找速度。约束数据的值,如UNIQUE INDEX,PRIMARY KEY,FOREIGNKEY。 - 数据库索引的分类:clustered Index,B/B+树的节点存放的就是一条条的记录;non-clustered index 存放的是记录的地址(存放的是指针)。
- B树和B+树的区别:数据库的一条条数据记录可以出现在B树的非叶子节点上,数据库的数据只出现在B+树的非叶子节点上。
- B树和二叉搜索树区别:B树每个结点有更多的元素和更多的儿子。
- 为什么用B/B+树而不用二叉查找树?
二叉树优化比较次数,B/B+树优化磁盘读写次数(磁盘的寻址加载次数)。由于 B 树的每一个节点,可以存放多个元素,所以磁盘寻址加载的次数会比较少。
B+树和B树比起来更适合顺序访问,B+树叶子节点上有所有数据,非叶子节点只起到了索引的作用 - m阶B/B+树
每个非叶子节点(除根外)至多有m个儿子,至少有向上取整ceil(m/2)个儿子。根节点(如果不是叶子至少有两个儿子)。所有叶子节点在同一层。