记mysql相关存储引擎、数据结构

索引是一种数据库高效获取数据的排好序的数据结构。

一、数据结构:Mysql使用的数据结构是B+树,是一种在B树的基础上改造的数据结构,二者之间的区别在于

1、B树的每个结点都存储了key和data,B+树的data存储在叶子节点上。节点不存储data,这样一个节点就可以存储更多的key。可以使得树更矮,所以IO操作次数更少,查找速度更快。

2、B+树的所有叶结点构成是一个有序链表并用指针连接(双向指针),可以提高范围查询的速度,而B树节点之间没有用指针连接。

二者结果如图所示

B树:

 B+树:

二、缓存池概念:

三、存储引擎:MyISAM、InnoDB。存储引擎不是修饰数据库的而是修饰数据库表,比如:

 二者主要区别如下:

1、InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务。

2、InnoDB是聚集索引,就是把表的数据和索引合在一起,MyISAM是非聚集索引,也是使用B+Tree作为索引结构,索引和数据文件是分离的,索引保存的是数据文件的指针。

比如下图就是一个user表在MyISAM存储引擎下生成的文件,frm为表的框架结构,MYD表示这个表的数据(data),MYI表示这个表的索引(index)。

如果是MyISAM存储引擎下,执行查询sql时会判断sql的条件字段(where后面)是否有索引,如果有索引会去MYI文件中快速定位索引元素,找到索引对应的数据的地址,再根据地址去MYD文件获取对应的数据,如下:

但现在的数据很少使用MyISAM存储引擎了,一般都使用InnoDB存储引擎,因为要支持事物,InnoDB存储引擎下的数据表是聚集的,也就是索引和数据文件是不分离的,在InnoDB引擎下的表只会生成两个文件,frm和ibd,ibd文件里面就是索引和数据的结合,在叶子节点里面存储不仅仅是索引,还有对应的数据,比如:

如上所示就是主键作为索引是在IndoDB存储引擎下存储的数据结构叶节点包含了完整的数据记录,不需要像MyISAM一样再去另外一个文件找对应的数据。

而非主键索引,叶子节点放的是索引所在行的主键。

一般来说使用InnoDB表应该建主键,而且要使用整形的自增主键,原因如下:

1、如果B+树下一个表不建主键,则数据库会去找一个所有元素都不重复的列字段作为索引组成B+树结构,如果不存在这样的列,则数据库会自动创建一个隐藏自增列,用这个隐藏列作为索引组成B+树结构,所以如果不自建主键,则Mqsql需要做的事情很多,影响性能。

2、之所以要用整型,是因为B+树的索引结构是按顺序排序,顺序排序就代表要比较大小,使用整型比大小要比非整型要快。之所以要顺序排序是因为可以更好的支持范围查找,比如某个行的索引从左到右为1、2、3、4、5、6,如果要查询索引为2到5的数据很明显要比不递增要快,同时查询数据的时候需要比较索引大小来判断要查询的数据。

3、自增是为了避免树结构频繁分裂,因为使用自增,构建索引树的时候后加入的数据永远都是从后面插入到索引树,非自增插入索引时因为要遵循顺序所以可能会插入到之间,比如原来的索引顺序为1、3、5、7,这时新加入一笔索引为4的数据,为了保持顺序这笔数据就会插入到3跟5之间,变成了1、3、4、5、7,这时树结构可能会分裂,影响性能。

四、联合索引,遵循最左前缀原理 

 -------以上部分图片来源于图灵学院诸葛老师视频讲解,感谢诸葛老师。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值