一、二叉树系列
1.二叉树:数据库索引需要有序,方便快速查找,二叉树无序,显然不合适。
2.二叉查找树:解决了二叉树无序的问题,但是它的效率不稳定,极端情况下可能转换为链表。
3.二叉平衡树(AVL树):在满足二叉查找树的情况下又保证了所有节点的左右子树高度差值不超过1,但是它需要不断地左旋右旋来保证树的平衡,损耗性能,而且,它随着数据增多,树高也会增加,磁盘IO的次数也会增加
为了解决二叉树磁盘IO的问题,引入了B树和B+树
二、B树(B-树)和B+树
B树和B+树都是多路搜索树,B+树是B树的变种,B树减少了树高
1.B树的索引和数据是存放在一起的,B+树只有叶子结点存放数据,非叶子结点只存放索引,这样是为了减少树高,并且让非叶子结点存储更多的索引,B+树的叶子结点间还有链表进行连接(MySQL优化成了双向链表),更加方便查找范围数据
三、MyISAM和InnoDB存储引擎
1.他们有什么区别
InnoDB支持外键,支持行级锁和表级锁,支持崩溃后的数据恢复,支持MVCC(多版本并发控制),MyISAM都不支持。
Innodb是聚集索引,索引和数据存放在一起,myisam是非聚集索引,索引里面存储的是数据存放的地址,InnoDB比较安全,但是对于写操作的效率低于MyISAM,MyISAM存储引擎适用于select和insert为主的应用。
2.MyISAM(读锁和写锁)& InnoDB(共享锁和排他锁)
共同点:读锁和共享锁都是可以同时进行多个读操作,读写操作互斥;写锁和排他锁都是对于读写,读读操作都互斥。
不同点MyISAM是表级锁,InnoDB是行级锁,可以更加细粒度的控制锁的范围,MyISAM更适合于读密集型的场景,InnoDB更适合于写密集型和事务性能要求高的场景。
四、回表查询
-
覆盖索引(Covering Index): 覆盖索引是一种包含所有查询所需字段的索引。当查询的列都包含在索引中时,数据库可以直接使用索引来满足查询需求,而不需要回表查询。这样的查询效率通常较高。
-
非覆盖索引: 非覆盖索引是一种不包含所有查询所需字段的索引。当查询的列有一部分未包含在索引中时,数据库需要在找到索引匹配的行后,再通过原始数据页(表中的数据行)进行一次额外的查找,以获取未包含在索引中的列的值。这个额外的查找过程就称为回表查询。