1、预备知识
(1)存储介质一般为主存和磁盘
(2)主存(RAM)支持随机存取,磁盘寻址需要定位【磁道】和【扇区】,对应产生【寻道时间】和【旋转时间】,因此磁盘的存取速度往往是主存的【几百分之一】
(3)由于【局部性原理】的归纳,以及磁盘IO非常耗时,实际情况下磁盘往往不是像主存那样【随机】【按需】读取,而是一次性读取目标数据【相邻】的多个【逻辑存储块】到内存中,这种策略叫做【磁盘预读】
(4)这个逻辑存储块被称为【页】,即计算机管理存储器的逻辑单位。硬件及操作系统往往将主存和磁盘存储区分割为连续的大小相等的块,每个存储块称为一页(大多数OS中页大小为4K),主存和磁盘以页为单位交换数据

2、数据库索引
(1)B-Tree
(2)B+Tree
(3)检索过程:首先在最上层节点进行二分查找,如果找不到则去对应左子节点或右子节点进行二分查找,以此递归
(4)B-Tree和B+Tree区别
—内节点不存储data,只存储key
—叶子节点不存储指针(叶节点和内节点大小一般不相同)
—叶子节点具有指向相邻叶子节点的指针(方便区间访问)
(5)索引设计思路
—索引本身也很大,不能直接在主存中存储,而是存在磁盘上。一个好的索引数据结构应该最大程度减少磁盘IO。
—数据库设计者巧妙地将【树节点】用【单位页】进行对应存储,这样一个节点的载入只需要一次磁盘IO。在B-Tree定义中,检索一次最多需要访问h(树高度)个节点,相应地最多需要h-1次IO(根节点常驻内存),时间复杂度O(h)= O(logdN),h为树高度,d为单个节点中Key数量,d越大,索引性能越好。一般d比较大,即横向比较长,h比较小,通常不超过3,因此B-Tree作为索引结构效率非常高。
(6)为什么不用二叉树或红黑树作为索引数据结构?
h较深,逻辑上相邻的父子节点在物理上可能很远,无法利用局部性
(7)为什么B+Tree优于B-Tree?
因为d越大,索引性能越好,dmax=floor(pagesize/(keysize+datasize+pointsize)),由于B+Tree内节点去掉了data域,因此可以拥有更大的出度,拥有更好的性能

3、MySQL两种不同索引实现
3.1 MyISAM索引实现
(1)使用B+Tree
(2)索引文件和数据文件独立
(3)内节点不包含Data域只存储Key,叶子结点包含Key和Data域(数据记录地址引用而非【实际数据记录】)
(4)非聚簇索引
(5)辅助索引独立与主键索引,都在叶子结点存储数据记录地址引用

3.2 InnoDB索引实现
(1)使用B+Tree
(2)数据文件和索引文件合二为一,即数据文件本身就是索引文件,本身就按照B+Tree结构组织
(3)叶子节点包含Key和【实际数据记录】
(4)数据文件默认按【主键】建立B+Tree结构,因此主键最好选择单调字段(自增字段),否则在插入或删除记录时会导致B+Tree频繁分裂
(5)数据文件不可能既按主键组织排序又按其它非主键字段组织排序,因此辅助索引是建立在主键索引基础上,按照辅助索引进行检索,首先检索到对应主键值,然后再跟进主键值定位到具体数据记录。也正因为此,主键索引不应该选择过长字段,否则导致辅助索引变得很大
(6)聚簇索引(一个表格只能有一个聚簇索引)

**注意:**MyISAM和InnoDB是两种不同的数据存储引擎,由于数据是存储在表格中,因此MyISAM和InnoDB是描述表格存储方式而不是整个数据库。一个数据库有很多表格,同一个数据库中的表格可以部分是MyISAM存储引擎,部分是InnoDB存储引擎。就某一个表格而言,只能选择MyISAM或InnoDB其中一种引擎作为实现。当表格选择MyISAM实现时,表格内非聚簇索引可以有多个,当表格选择InnoDB实现时,聚簇索引只能有一个!

4、索引使用策略及优化

主键和唯一索引区别
(1)主键是特殊的唯一索引,唯一索引不一定是主键
(2)一个表可以有多个唯一索引,但只能有一个主键(可以是联合主键)
(3)主键列不允许空值,而唯一索引列允许空值

待学习…..