一 · 基本数据结构
数据结构演示网址:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
二叉树:
1,以根节点为平衡点,右节点用远大于根节点,左边永远小于根节点
2,插入数据比较快,维护性好
3,查找数据比较慢,因为熟的高度不可控,熟的高度决定查找效率
4,用二叉树存储连续的数据时,会退化成链表
平衡二叉树:
1,约定了左右两边高度差不大于1,解决了二叉树高度不可控的问题,这是一种左右两边高度平衡的树
2,维护性差,每次插入数据要重新计算左右两边的高度
红黑树:
1,相较于平衡二叉树,红黑树做了优化,在相对控制树的高度的同时,较少了维护
2,相对来说,查找和更新都比较适中
B树:
1,根节点和叶子结点都存数据
2,熟的高度固定,所以检索次数确定,插入数据快
3,范围查询比较麻烦
B+树:
1,树的高度固定,检索次数确定,插入数据快
2,根节点不存数据,所有数据存在叶子结点
3,B树根结点存储着数据,所以每次load根结点时时间比B+树长
4,B+树每个叶子结点的第一个和最后一个存储着前一个和后一个数据块的
综上所述,mysql一般用B+树存索引,还有hash表(一般只会用于唯一索引)
B+树能存多少数据?
二 mysql的存储引擎
常见mysql存储引擎有InnerDB和MyISAM
在mysql的data目录下,有每个数据库对应于一个文件夹,每个文件夹中,存着这个数据库的所有数据及索引
MyISAM(非聚集索引):
非聚集索引是只存索引不存数据,只存数据的磁盘文件地址
1,一张表对应三个文件 .frm文件,存储当前表结构数据,.MYD文件,存储当前表的真实数据 .MYI文件,存储当前表的索引数据
2,取数据的时候,在索引文件中找到该索引,再到.MYD文件中找到该数据
InnerDB(聚集索引):
聚集索引是主键索引的叶子结点存储着该行所有数据,用二级索引的时候会回表到主键索引中找数据
1,一张表对应两个文件, .frm文件与上面相同,存储表结构数据 .idb文件存储着所有的索引信息(主键索引对应的索引树存储着表数据)
2,聚集索引取数据比非聚集索引快,因为后者要跨文件找数据
mysql推荐建一个自增主键,B+树中叶子结点的指针为了更好的范围查询,自增主键是为了保证插入元素时一直往后排,如果插入一个中间的主键索引,要往中间插入还要进行树的平衡,这样会影响数据插入的效率
如果没有自增主键,mysql会帮我们建一个隐藏的自增主键(在表中加一个字段)
这张图表示主键索引的叶子节点存储着所有的字段数据,二级索引的数据块存储着主键索引的索引值,如果用二级索引搜索,会先找到主键索引值,然后在主键索引树中拿数据
联合索引