MySQL分享

MySQL分享

索引

什么是索引
  1. 想要快速查询数据,需要使用优秀的查找算法
  2. 优秀的查找算法依托的是优秀的数据结构
    • 二分查找,需要被检索的数据有序
    • 二叉树查找,需要是二叉树的数据结构
  3. 数据库的数据不可能完全满足各类数据结构
  4. 数据库系统维护满足特定查找算法的数据结构,并以某种方式指向数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构,就是索引
索引的数据结构
  1. Hash
    • 特性:把索引数据进行hash计算得到一个hash地址,相当于点对点查询,性能很好
    • 缺点:不支持范围查找
  2. B-Tree
    • 特性:
  3. b+Tree
索引的存取

索引文件一般较大,索引会存储在磁盘上

磁盘存取原理

索引的检索,需要磁盘的IO操作,存在机械运动耗费,时间消耗相对于内存存取是巨大的。

一个磁盘由大小相同且同轴的圆形盘片组成,磁盘可以转动(各个磁盘必须同步转动)。在磁盘的一侧有磁头支架,磁头支架固定了一组磁头,每个磁头负责存取一个磁盘的内容。磁头不能转动,但是可以沿磁盘半径方向运动(实际是斜切向运动),每个磁头同一时刻也必须是同轴的,即从正上方向下看,所有磁头任何时候都是重叠的。
盘面

盘片被划分成一系列同心环,圆心是盘片中心,每个同心环叫做一个磁道,所有半径相同的磁道组成一个柱面。磁道被沿半径线划分成一个个小的段,每个段叫做一个扇区,每个扇区是磁盘的最小存储单元。为了简单起见,我们下面假设磁盘只有一个盘片和一个磁头。当需要从磁盘读取数据时,系统会将数据逻辑地址传给磁盘,磁盘的控制电路按照寻址逻辑将逻辑地址翻译成物理地址,即确定要读的数据在哪个磁道,哪个扇区。为了读取这个扇区的数据,需要将磁头放到这个扇区上方,为了实现这一点,磁头需要移动对准相应磁道,这个过程叫做寻道,所耗费时间叫做寻道时间,然后磁盘旋转将目标扇区旋转到磁头下,这个过程耗费的时间叫做旋转时间。

局部性原理

当一个数据被用到时,其附近的数据也通常会马上被使用

磁盘预读

根据局部性原理,为了减少磁盘IO,磁盘往往不是按需进行读取,而是每次都会进行预读,顺序往后读取一定长度的数据到内存中(不用寻道,顺序旋转即可)


Mysql索引实现

MyISAM

MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。如下图所示:
在这里插入图片描述

  • MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。
  • MyISAM的辅助索引结构与主键索引结构一致,唯一的区别是辅助索引的key可以重复。

因此,MyISAM的索引方式也叫做“非聚集索引”

InnoDB

InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM不同。

  • InnoDB的数据文件本身就是索引文件,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。如下图所示:
    在这里插入图片描述

  • 因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须要有主键,如果没有显式指定,MySQL会自动选择一个可以唯一标识数据行的列作为主键,如果不存在这样的列,则MySQL会自动生成一个long类型的隐含字段作为主键。

  • InnoDB辅助索引的data域存的是相应记录的主键值。也就是说,通过辅助索引检索数据,需先检索辅助索引树,获

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值