关系型数据库,索引、B-tree、B+树、Hash索引、存储索引InnoDB和MySql

数据库之 关系型数据库:
关系型数据库涉及知识点:
架构、索引、锁、语法、理论范式

如何设计一个关系型数据库:
1.需要有存储的文件系统(SSD固态硬盘、机械硬盘)
2.要有程序实例用逻辑结构映射出物理结构(存储管理、缓存机制、SQL解析、日志管理、权限划分、容灾机制、索引管理、锁管理)

索引模块:
1.为什么要使用索引
灵感来源于 字典
*快速查询数据
2.什么样的信息成为索引
主键、唯一键、普通键
3.索引的数据结构
*生成索引,建立二叉查找树进行二分查找
*生成索引,建立B-Tree结构进行查找
*生成索引,建立B±Tree结构进行查找(MySQL)
*生成索引,建立Hash结构进行查找

B-Tree特点:
根节点至少包括两个孩子
树中每个节点最多含有m个孩子(m>=2)
除根节点和叶节点外,其他每个节点至少有ceil(m/2)个孩子
所有叶子点都位于同一层
*关键字按顺序升序
*关键字的个数比孩子要少一个
*关键字对应的左边的孩子的值都小于关键字,右边的孩子都比关键字大

B±树
在这里插入图片描述
B+Tree更适合用来做存储索引原因:

*B+树的磁盘读写代价更低(内部存放索引信息,存入关键词多,一次性读入内存的数据就越多,效率高IO次数就少)
*B+树的查询效率更加稳定(根到叶子节点,所有数据查询长度相同,稳定)
*B+树更有利于对数据库的扫描(遍历叶子节点范围查询)

Hash索引:
Hash索引查询效率较高
缺点:
*仅仅能满足“=”,“IN”,不能使用查询范围
*无法被用来避免数据的排序操作
*不能利用部分索引键查询
*不能避免表扫描
*遇到大量Hash值相同的情况后性能并不一定就会比B-Tree索引高

密集索引和稀疏索引的区别:
*密集索引文件中的每个搜索码值都对应一个索引值
*稀疏索引文件只为索引码的某些值建立索引项

MYSQL有两种存储引擎:
MYISAM:大都索引是稀疏索引

InnoDB:有且仅有一个密集索引;
若一个主键被定义,则该主键则作为密集索引
若没有主键被定义,该表的第一个唯一非空索引则作为密集索引
若不满足以上条件,innodb内部会生成一个隐藏主键作为密集索引
非主键索引相关键位和其对应的主键值,包含两次查找

InnoDB的索引和数据是分开的
MYISAM的索引和数据是在一起的

如何定位并且优化慢查询Sql:
根据慢日志定位慢查询SQL
使用explain等工具分析sql
修改sql或者尽量让sql走索引

索引建的越多越好吗?
*数据量小的表不需要建立索引,建立会增加额外的索引开销
*数据变更需要维护索引,因此更多的索引意味着更多的维护成本
*也意味着需要更多的空间