Mysql-Innodb引擎和MyISAM引擎之间的区别

功能 Innodb MyISAM
数据结构 B+tree B-tree
事务 支持 不支持
表锁和行锁 表锁
表和索引 表结构和索引存放在一块、非聚集索引 表数据和索引不在一块、聚集索引
索引 不支持全文索引 支持全文索引

一、B+树和B树

我们主要介绍B+树,因为B树和B+树之间的区别不大,最后总结一下B树和B+树之间的区别就可以了

1、B+tree

对于一个m阶的B+tree有着以下的性质

- 每个叶子最多包含n-1个搜索码值K1K2K3....Kn-1 和n个指针P1P2P3....Pn
- 每个叶子节点的搜索码值Ki保存的是索引列的值,而指针指向的是文件的记录,而Pn指向的是下一个叶子结点
- 对于任意两个叶子结点LiLj同时满足i<j;那么Li中的搜索码值都小于Lj中的搜索码值
- 对于任意一个非叶子节点最多要包含n-1个搜索码值,n个指针,而且最少要包含floor(n/2)个值
- 如果根节点不是叶子节点,那么至少包含两个指针指向其child节点
- B-tree中父节点的搜索码值会重复出现在子节点的搜索码值中,且按顺序排放
2、B-tree

对于一个m阶的B-tree,我们有一以下的性质

- 每一个节点都最多有m个child
- 每一个非叶节点都至少有ceil(m/2)个指针指向child节点
- 根节点如果不是叶节点,那么至少包含两个指针指向child
- 所有的叶子在书中具有同样的高度
- 每个节点除了需要存储搜索码值、指向child的指针,还需要存储指向文件记录的指针
- B-tree中父节点的搜索码值不会出现在子节点的中

总结:

  • 从上面定义我们可以看出,对于使用的数据结构来看,B+tree的搜索码值会出现在叶节点中,而B-tree则不会
  • 相比较于B+树,B树中的搜索码不会重复,因此B树中leaf node和non-leaf node都存有指向文件记录的指针
  • 因为B树中除根节点外,每一个节点都需要存储指向文件的指针,因此B树的扇出较小(一块磁盘块存储的所搜码值少),所以B树相比较而言会高于B+树的结构
  • 因为B+树所有搜索码值都会在叶节点以一定的顺序进行排列,因此对于删除操作会出现只是在叶节点中进行删除,而B树的删除操作可能会出现在non-leaf node,比较麻烦。

二、聚集索引和非聚集索引

1、聚集索引(clustered index)

定义:包含记录的文件按照某个搜索码值指定的顺序排放,那么该搜索码对应的索引称之为聚集索引

clustered index 的性质
- 聚集索引基于数据行(或视图)的key value进行排序和存储。每张表最多只有一一个聚集索引,因为数据行只能以一个序列进行排序。
- 一个table包含一个clustered index 时,这个表被称之为clustered table.如果一张表没有clustered index,那么行数据存储是无序的。

根据上面的描述我们可以知道对于B+tree的数据结构,我们B+树的搜索码值和指向文件记录的是按照大小进行排序的,因此聚集索引使用的数据结构是B+tree.

2、非聚集索引(nonclustered index)

定义:搜索码指定的顺序与文件中记录的物理顺序不同的索引称之为非聚集索引

nonclustered-index的性质

  • 非聚集索引和数据行是分离的。一个非聚集索引包含了的键值,同时每一个key value Entry 有一个之怎指向包含nonclustered index 的key value的数据行(按照这个么说,非聚集索引和index的数据结构采用的是B-tree了)
  • 非聚集索引的索引行指向数据行的指针被称之为row locator。row locator的结构取决于data page是存在于堆中还是在聚集表中。对于一个堆,row locator是一个指向数据行的指针,对于clustered表,row locator是聚集索引的键。

参考文章
https://en.wikipedia.org/wiki/B-tree
https://en.wikipedia.org/wiki/B%2B_tree
https://www.cnblogs.com/s-b-b/p/8334593.html
https://docs.microsoft.com/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described?view=sql-server-2017

猜你喜欢

转载自blog.csdn.net/makeliwei1/article/details/81139848