文章目录
- 1. 事务的特性ACID
- 2. 事务并发可能出现的情况
- 3. 隔离级别
- 4. 二叉树、平衡二叉树、B树,B+树?
- 5. MySQL索引原理:
- 6. 最左前缀匹配
- 7. Tree索引和Hash索引的区别
- 8. MySQL索引调优
- 9. 事务的实现原理(redo+undo)
- 10. mysql存储引擎
- 11. MySQL为什么查询速度快其实就是问B+树为什么查询速度快?
- 12.红黑树为什么快,请简述一下原因
- 13. mysql的char和varchar区别
- 14.行级锁和表级锁
- 15.为什么mysql要用B+树
- 16.数据库优化方法
- 17.建立索引原则
- 18.索引缺点
- 19. 数据库中的锁有哪些
- 20.Mysql聚簇和⾮聚簇索引的区别
- inner join和outer join有什么区别
- 关系型数据库和非关系型数据库
- redo日志
- undo日志
- MySQL的ACID特性分别是怎么实现的
1. 事务的特性ACID
原子性:要么全部执行成功,要么不执行,只有其中一个指令失败,就重来
一致性:对于整个数据的完整性保持稳定
隔离性:多个并发事务之间要隔离
持久性:当事务正确完成后,对于数据的改变是永久性的
2. 事务并发可能出现的情况
脏读:一事务读到了另一个未提交事务修改过的数据。若不提交读到的数据不存在
不可重复读:不同时刻读到数据不一致
幻读:读到的数据第二次比第一次多。
3. 隔离级别
读未提交:可读到未提交的数据
读已提交:只能读到已经提交的内容,避免了脏读
可重复读:当事务启动时,不允许修改,避免了脏读和不可重复读
可串行化:事务一个个排队执行(效率低,开销大)
4. 二叉树、平衡二叉树、B树,B+树?
二叉树:左子树的孩子节点比自己小,右子树的孩子节点比自己大
平衡二叉树:两子树高度差小于等于1
B树:多路平衡查找树,每个节点可以存储多个
B+树:只有叶子节点存储数据,构成有序列表,非叶子节点存储关键索引
5. MySQL索引原理:
是存储引擎用于快速找到记录的一种数据结构——B+树
- B+树节点存储的是索引,在单个节点存储容量有限的情况下,单节点也能存储大量索引,使得整个 B+树高度降低,减少了磁盘 IO。
- B+树的叶子节点是真正数据存储的地方,叶子节点用了链表连接起来,这个链表本身就是有序的,在数据范围查找时,更具备效率。
因此 Mysql 的索引用的就是 B+树,B+树在查找效率、范围查找中都有着非常不错的性能。
6. 最左前缀匹配
建立联合索引时,最左优先;检索数据时,从联合索引最左边开始匹配。
在索引时会先对第一个字段排序,再依次对第二第三。。
7. Tree索引和Hash索引的区别
- 等值查询,hash索引更好;范围查询只有树索引可以
- Hash索引不能利用索引排序,以及范围查询,不支持最左前缀匹配原则
- 关键字检索效率平均,在有大量重复键时hash索引效率极低
8. MySQL索引调优
- and/or条件相连,命中索引从而加快速度
- like的前导模糊查询不能使用索引
- union,in,or都能命中时建议用in
- 负向条件查询不能用索引
- 范围列可以用索引
- 联合索引最左前缀原则
9. 事务的实现原理(redo+undo)
Redo log:重做日志,为了性能不会把每次修改都同步到磁盘里,而是会先存到缓冲池中,然后使用后台线程去做缓冲池和磁盘之间的同步,
Undo log:回滚日志,发生错误时才可以回滚
锁技术+MVCC
锁技术:读写锁(读锁:共享锁/写锁:排它锁)
MVCC基础:多版本并发控制,通过每行记录的后面两个隐藏列来实现,依赖undo log+read view.
undo log:记录数据的多个版本数据,read view:判断当前版本可见性
10. mysql存储引擎
myisam,innodb
- InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务
- InnoDB支持外键,而MyISAM不支持。
- InnoDB是聚集索引的B+树主键索引的叶子节点就是数据文件,辅助索引的叶子节点是主键的值;而MyISAM是非聚集索引的B+树主键索引和辅助索引的叶子节点都是数据文件的地址指针。
- InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快(注意不能加有任何WHERE条件)
- Innodb不支持全文索引,而MyISAM支持全文索引,
- MyISAM表格可以被压缩后进行查询操作
- InnoDB支持表、行(默认)级锁,而MyISAM支持表级锁
- InnoDB表必须有唯一索引,否则生产一个隐藏列Row_id当默认主键,而Myisam可以没有
- Innodb存储文件有frm、ibd,而Myisam是frm、MYD、MYI Innodb:frm是表定义文件,ibd是数据文件 Myisam:frm是表定义文件,myd是数据文件,myi是索引文件
- MyISAM为某个字段添加索引时,会生成对应字段的索引树,该字段的索引树的叶子节点记录了对应数据的物理地址,然后拿着这个物理地址去数据文件里定位到具体的数据记录。
InnoDB加索引,会建立索引 B+树,节点里存的是KEY,叶子节点存储的数据的是主键 KEY。拿到KEY 后,InnoDB 会去主键索引树里根据 KEY 查找到对应的数据。
11. MySQL为什么查询速度快其实就是问B+树为什么查询速度快?
层数少,只在叶子节点存数据的特点就能极大的保证磁盘IO次数少
12.红黑树为什么快,请简述一下原因
根节点是黑色;节点是红色或黑色;所有叶子节点都是黑色,叶子节点为 NIL 节点,不储存数据;每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。);从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。
红黑树是一颗会自动调整树形态的树结构,红黑树会自动左旋右旋节点以及节点变色,调整树的形态,使其保持基本的平衡状态,也就保证了查找效率不会明显减低。从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。结果是这个树大体上是平衡的。因为操作比如插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的。红黑树相对于AVL树来说,牺牲了部分平衡性以换取插入/删除操作时少量的旋转操作,整体来说性能要优于AVL树。
1.红黑树的应用
红黑树的应用比较广泛,主要是用它来存储有序的数据,它的时间复杂度是O(lgn),效率非常之高。
例如,Java集合中的TreeSet和Tr