1.Mysql的存储引擎有哪些?

·MyISAM:5.5之前系统表默认用的是这个
·Innodb:5.5之后系统表用的是这个
·Memory
·Federated
·Archive
·Merge
·Cluster
·Example

2.索引是什么?

索引其实就是为了加速对表中数据进行检索而创建的一种分散存储的数据结构

3.为什么要用索引?

·索引极大减少存储引擎需要扫描的数据量
·索引可以把随机IO变成顺序IO
·索引可以帮助我们在进行分组、排序等操作时,避免使用临时表

4.为什么用B+tree?

二叉树:首先它不是一个平衡的树,极端情况会导致树的检索效率大大的降低
平衡二叉树:如果数据量特别大的话,树的高度就会很高,导致效率降低;每个磁盘块保存的数据量太小了,并且没有利用好操作磁盘IO的数据交换特性(预读能力),会带来频繁的IO操作
注:操作系统是以页为单位来操作数据,每页为4kb;而mysql每页操作16kb
完全平衡:整个树的高度差不超过1
非完全平衡:树的一个子节点的高度差不超过1
那么怎么保证它平衡的呢,是通过左旋转的方式来保持的(insert)
而B+tree是多路平衡的二叉树:所以同样数据,它树的高度会低很多,会提高数据的检索效率
insert:中间的关键字往上顶,保证平衡

B+tree:
·左闭合
·非叶子节点只保存关键字与子节点的引用,不保存数据区
·叶子节点保存了关键字对应的数据
·叶子节点是顺序排列的,并且相邻节点具有顺序引用关系
·关键词=度(子节点的数量)

注:所以B+tree的非叶子节点才会保存更多的关键词,树的高度会更低

总结:
1.B+tree是B-tree的变种,它也拥有B-tree的优势
2.B+tree扫库、表能力更强(因为他不需要扫描所有节点,只需要读其叶子节点,非叶子节点不存放数据区)
3.B+tree的磁盘读写能力更好(非叶子节点不存放数据区,所有会存放更多的关键词)
4.B+tree的排序能力更强(相邻两个节点,前一个节点的尾结点会保存后一个节点头结点的引用)
5.B+tree的查询效率更加稳定

5.树的节点中放了哪些数据?

·关键字:可以认为就是需要查找数据的索引的信息(关键字数量=路数-1)
·数据区:就是磁盘存放该数据的地址
·子节点的引用:子节点的引用信息

6.MyISAM解析

show variables like ‘datadir’ —> /var/lib/mysql/

B+tree索引提现形式—MyISAM

两个文件:
.frm:表定义文件
.MYD:数据存放文件
*.MYI:索引存放文件

7.Innodb解析

B+tree索引提现形式—Innodb

一个文件:*.IBD
并且是以主键为索引来组织数据的存储。如果你没有自己创建,Innodb会默认帮你见一个隐藏的6byte的int型的索引。
聚集索引:数据库表中数据的物理顺序与键值的逻辑(索引)顺序相同。
如果一张表里有主键索引,那么该主键索引就是聚集索引
如果一张表里没有主键索引,但是有非空的唯一索引,则该唯一索引就是聚集索引
如果一张表里没有主键索引,也没有非空的唯一索引,则indodb会创建一个隐藏列,6bt,自增的,作为聚集索引

8.Innodb与MyISAM索引的展现形式

辅助索引:
Innodb:辅助索引最终指向的主键索引
MyISAM:辅助索引指向的是磁盘地址

总结:如果通过辅助索引查找数据,只要一次就能找到,而Innodb需要在通过主键查找一次;而当我们修改了主键的同时,我们只需要修改辅助索引指向主键的值。

9.索引的三大原则

·离散型原则:离散型越高,选择性就越好
·最左匹配原则:索引中关键字是从左边进行匹配的,而且不可能跳过
·最少空间原则:空间越少,可以存储的关键字就越多

注:单列索引就是联合索引的一种特殊形式。

10.覆盖索引

覆盖索引:如果查询列可通过索引节点中的关键字直接返回,则该索引称为覆盖索引
优势:减少数据库的IO操作,不需要回表,从而提供查询效率

所以这也是为什么不提倡用通用mapper来查询数据的原因,因为他用不到覆盖索引。