数据库知识复习
如何设计一个关系型数据库
第一部分:程序实例
存储管理:逻辑关系转换成物理存储关系
缓存机制:优化存储管理效率
SQL解析:解析SQL语句
日志管理:记录操作
权限管理:多用户管理
容灾机制:灾难恢复
索引管理:优化数据查询效率
锁管理:支持并发操作
第二部分:存储(文件系统)
索引模块
为什么用:快速查询数据,数据量大的要避免全表扫描,关键信息定位数据
什么能成索引:主键/唯一键/普通键
索引数据结构:二叉查找树/B-树/B+树/Hash结构
二叉查找树
右子树>中间节点>左节点O(logn) 容易深度过大,引起O(n) 复杂度
B树:
跟根节点至少两个孩子,每个节点最多有m(m>=2)个孩子,除了根叶,每个节点至少有ceil(m/2)孩子,所有叶子节点在同一层
如果一个非终端节点包含n个关键字信息,其中:Ki(i=1…n)为关键字,且关键字按顺序升序排列**//关键字个数n比孩子数m少一个(n<=m-1),n>ceil(m/2)-1//**左孩子值都小于最左边关键字的值,右子树值都大于关键字,其他的孩子节点的则位于关键字最小值和最大值的值域内
关于B树的插入删除操作见
https://blog.csdn.net/qq_38972783/article/details/97812186
目录为数据结构,目录下面还有B+树和红黑树
B+树
非叶子节点关键字数量和孩子数指针一样**//非叶子节点值划定了孩子的值域,两个相邻关键字就是其指向的子节点的值域//叶子节点存数据//**非叶子节点就为了索引/这个是范围统计,到叶子节点有链表指向下一个叶子节点。
读写代价低,查询效率稳定,更有利于数据库扫描
Hash索引
hash值对应到桶的地址,桶内部是链表相连,去里面找到所要的值
但是他只能等值过滤,不能范围查询,无法避免排序,不能利用部分索引键查询,不能避免表扫描(要访问hash值对应的桶内的所有数据),大量hash值相同的话性能不一定好毕竟值都放一个桶里面了。
Bitmap索引
适用只有固定的几个种类字段,在不同位置上用0 1表示他是否是该种类,不适合高并发,因为增删改查的时候某行的不同种类对应的位数可能会发生改变
密集索引和稀疏索引的区别
密集索引每个搜索码都对应一个索引值
稀疏索引只为部分值建立索引项
MySql的索引有InnDB/MyISAM
若一个主键被定义,该主键则作为密集索引
若没有主键被定义,该表的第一个唯一非空索引作为密集索引
上面都没有就生成一个隐藏主键
非主键索引存储相关键位和其对应的主键值,包含两次查找
键则作为密集索引
若没有主键被定义,该表的第一个唯一非空索引作为密集索引
上面都没有就生成一个隐藏主键
非主键索引存储相关键位和其对应的主键值,包含两次查找