MySQL数据结构,存储引擎

第一章 MySQL原理

需要解决的问题:
脑海中构建一个属于总结的思维导图
数据结构间的区别
b树和b+树区别,b到b+树优化了什么,为什么要这么优化
myisam和innodb区别,共同点
什么叫聚集索引和非聚集索引
为什么建议要设主键索引,为什么要整型,自增为什么
hash数据结构和b+树,hash快为什么不使用呢
二级索引,为什么不能放data,不能放所有数据呢【回表】
联合索引用的最多—不建议太多单值索引
最左前缀原理,为什么不用左边第一个就没用了

1、索引数据结构

总:索引是排好序的数据结构(后面的很多分析都要考虑到这个点【如:索引为什么会失效】)
主要需要了解,hash,b树,b+树,了解底层数据结构原理、区别

  • (1)二叉树

在这里插入图片描述

  • 二叉树:

    • 缺点:因为左小右大的原则,当索引一次递增可能造成成链的问题—想办法优化成红黑树
  • 红黑树

    • 缺点:当数据量太大时,树的高度太高。从树的根节点出发的话,查询次数太多-----想办法优化树的高度=》b树
  • (2)hash

在这里插入图片描述

  • 对key进行hash计算
  • hash比b+树快
  • 那为什么不使用hash呢?
    • 不支持范围查找,仅支持等职查找
    • 所以推荐b+树,原因叶子节点排好序并且有双向指针(详细见下面的b+树)
  • 缺点:hash碰撞会
  • (3)b树

在这里插入图片描述

  • 1、通过索引构建出b树

  • 2、 以key-value的形式存在,索引和值

  • 3、节点中的值都是从左到右依次递增的

  • 4、缺点:每个节点有data元素==》造成树的高度太高,查询次数会增加

  • 5、缺点:b+树范围查找效率高,b树范围查询不高原因叶子节点没有双向指针

  • (4)b+树

在这里插入图片描述

  • 1、非叶子节点仅存冗余索引,不存放data(目的是为了节省空间,可以存放更多的索引;如果像b树一样以k-v的结构存放的话,那v一定会占一定的空间,导致索引放的数量减少了==》那么树的高度也会减少)
  • 2、叶子节点包含所有的索引字段+data
  • 3、叶子节点使用双向环形链表完成,提高访问性能
  • 4、mysql将叶子节点常驻再内存中,避免了I/O的性能损耗,提高效率

2、存储引擎

  • 1、MyISAM(使用b+树)

在这里插入图片描述

  • (1)使用索引在MyISAM中查找的过程
    • 通过索引查询到内存地址
    • 然后通过内存地址找到对应的数据
    • ==》非聚集索引
  • (2)叶子节点中data存放的是内存地址
  • 总结
    • MyISAM是非聚集索引,通过内存地址回表进行数据查找
  • InnoDB(使用b+树)

在这里插入图片描述

   										图一、主键索引											图二、二级索引				
  • (1)查询过程
    • 通过索引定位到值直接查询
    • ==》聚集索引
  • (2)和MyISAM不一样的是,叶子节点data存放的完整的数据
  • (3)为什么建议要设主键索引,为什么要整型,自增为什么
    • 3.1:自己不建的话,mySQL自己去挑一个不会重复的列或者隐藏列,去维护一个主键索引去存储数据(建立聚集索引),这样一定是损耗性能的,那么还不如自己干
    • 3.2:整型的速度比较的一定比别的快、节约空间
    • 3.3:自增:因为索引都是排号序的,如果硬插入一个不是自增的元素,树会自己平衡一次(效率就下降了)
  • 二级索引:在叶子节点的data中存放的是主键索引的值,然后回表到主键索引,查询到所有数据
  • 总结:
    • innoDB只有主键索引是聚集索引,别的索引类型不是聚集索引,还是要通过回表操作的
    • 父节点中的冗余索引都是其子节点第一个节点最小的元素

3、最左前缀原则

在这里插入图片描述

  • 1、联合索引(复合索引)
    • 排好序的数据结构==》先排name,name相等排age,依次类推
    • 在使用索引的时候必须使用联合索引的最左边的第一个列==》原因就是在构建树的时候,每个节点都是按照你所设置好的索引排好序的,举个例子:联合索引a、b、c;在构建树的时候如果a不相同,那么直接使用a进行排序构建树,但是你使用的是b进行查询的话,它就不能够定位了。【一定要理解排好序的原理】
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值