问:如何设计一个关系型数据库?
其实就是分析数据库的设计逻辑,拆分的各个模块,考验你对数据库的运作和各个功能是否有所了解。
问:为什么要使用索引?
快速查询数据 避免全表扫描(表数据比较大适用)
问:什么样的信息能够成为索引?
主键、唯一键等,只要能够让数据存在却别性的字段都能成为索引。
问:索引的数据结构?
二叉查找树、B-Tree、B+-Tree 、Hash
- 二叉查找树 时间复杂度 O(logn) 二分查找的算法 速度快 ,但是在某些情况下会变成O(n) 不稳定,根节点越多性能越差
- B-Tree 定义 balance-tree
根节点至少包含两个孩子
树中每个节点做多含有m个孩子(m>=2,既阶数)
除根节点和叶节点外,其他每个节点至少有ceil(m/2)个孩子
所有叶子节点都位于同一层
b-tree的查询效率和二分查找树一样的,且层级矮的多,在大量数据的时候比较稳定,约等于O(logn)
- B+-Tree balance+-tree(主流)
如图 非叶子节点的子树有三个 跟指针的个数一样 表明能存更多的关键字
非叶子节点不存放数据,只存储索引,数据都在叶子节点上。 b+树的检索就是从根节点开始 一直检索到子节点
叶子节点链接起来 可以快速的做统计、排序
结论: B+树更适合用来做存储索引
B+树的磁盘读写代价更低。非叶子节点只存放指针索引,不包含数据,所以整体大小更小。如果放在同一硬盘上,占用的总板块越小,所以IO调用更少。
B+树的查询效率更加稳定 。所有查找都要走根到叶子节点的路,所以查询效率都是 O(logn)。
B+树更有利于对数据库的扫描。因为有叶子节点链接,所以做范围查询、统计的时候更高效。
- Hash索引
hash查询效率最高 一次查找既能除结果,但缺点明显,所以不能做主流索引
- BitMap位图索引
高效的统计bool类型的索引,因为只做cpu的叠加操作,不过锁力度比较大,目只有Oracle和redis支持。
4.密集索引和稀疏索引的区别
- 密集索引文件中的每个搜索码都对应一个索引值
- 稀疏索引文件只为索引码的某些值建立索引项
密集索引决定了一个表的物理排列顺序(一个表只能有一个物理排列顺序),所以一个表只能有一个密集索引。
InnoDB 的文件结构是 .frm 和.ibd两个文件 .frm是存放数据结构信息 .ibd是存放索引和数据
MyISAM 是.frm .MYI .MYD 区别就是索引和数据分开的
源自: 慕课