1,B+树的特性
1,B+树的叶子结点是有指针的,并且指针是双向的
2,叶子节点包含了所有的元素,叶子节点是可以存储多个元素,节点中的元素是已经排好序的
mysql中的默认数据引擎是InnoDB,在Insert数据之后,然后查询出来的数据是已经按照mysql主键进行了排序
2,InnoDB中的’页’
操作系统中也有页,Innodb中也有,在操作系统中页是一个逻辑单位,目的在于减少磁盘的交互 提升跟磁盘交互的性能,一页的默认大小为4KB
而在InnoDB中一页的大小为16KB,在页中主要包含 页目录 和用户记录这两个区域
InnoDB在插入的时候按照主键排序,会影响插入时候的效率,但是可以提高查询的效率,当查询的数据量过多的时候,用户数据查询链表会非常的慢,这个时候就引入了页目录,页目录中的地址偏移量称为槽(slot),新开辟的页目录可以解决长链表问题,以空间来换取时间
3,InnoDB中的索引
索引是一种数据结构,是为了mysql高效获取数据结构,通过主键划分出来,所以是主键索引,mysql中只能有一个主键,但是可以有多个索引
在Mysql数据库中有很多索引,每一种存储类型的所以都不太一样,主要的引擎有两种:innoDB 和 MYISAM,在InnoDB中有三种索引:
- B-Tree 索引
- 哈希索引
- 全文索引
在B-Tree索引中又分为主键索引以及普通索引 根据上图能看到InnoDB 和 MYISAM类型的区别在于:
InnoDB 的叶子上放的是索引所在行的数据
MYISAM的叶子节点上方的一个地址,指向索引所在行数据的地址,所以当根据索引找到这行数据的时候他还要去根据地址去磁盘上找到这个数据;然后上面那些节点不存放数据!!数据都在叶子节点上;
由于哈希不好做范围查找,平常在查找的时候一般通过B+tree索引
4,索引的生成方式
如果没有主键索引的话就去去看看有没有唯一索引,如果没有的话就会在一行生成rowId,rowId是自增的,把rowId当成主键
InnoDB一定要有一个主键,在insert时候按照主键进行排序,只有按照主键进行排序之后才会慢慢生成主键索引,可以方便去查询
索引可以进行范围的查询就如sql语句中的between and,双向查询非常方便。这就是为什么B+树中的结点中的指针是双向的原因
5,Mysql索引优化