树 - AVL树,红黑树,B树,B+树,Trie树

AVL树

红黑树

B树

首先阐明一下,所谓”B减树“,B-树,就是B树,B-树和B树是一个东西。部分资料语焉不详,误导了我很长一段时间。

AVL树,红黑树,这些平衡二叉搜索树都有一个问题,每次插入和删除可能都需要重新平衡,重新左旋右旋,这在内存中不是什么大问题,所谓左旋右旋就是把指针指来指去罢了,但是如果持久化在磁盘,大量查询和搜索引发的磁盘IO消耗就很高了。

磁盘I/O

磁盘服务时间,即磁盘完成一个I/O请求所花费的时间,由寻道时间、旋转延迟和数据传输时间三部分构成。

  1. 寻道时间
    Tseek是指将读写磁头移动至正确的磁道上所需要的时间。寻道时间越短,I/O操作越快,目前磁盘的平均寻道时间一般在3-15ms。

  2. 旋转延迟
    Trotation是指盘片旋转将请求数据所在的扇区移动到读写磁盘下方所需要的时间。旋转延迟取决于磁盘转速,通常用磁盘旋转一周所需时间的1/2表示。比如:7200rpm的磁盘平均旋转延迟大约为60*1000/7200/2 = 4.17ms,而转速为15000rpm的磁盘其平均旋转延迟为2ms。

  3. 数据传输时间
    Ttransfer是指完成传输所请求的数据所需要的时间,它取决于数据传输率,其值等于数据大小除以数据传输率。目前IDE/ATA能达到133MB/s,SATA II可达到300MB/s的接口数据传输率,数据传输时间通常远小于前两部分消耗时间。简单计算时可忽略。

机械硬盘的连续读写性能很好,但随机读写性能很差,这主要是因为磁头移动到正确的磁道上需要时间,随机读写时,磁头需要不停的移动,时间都浪费在了磁头寻址上,所以性能不高。衡量磁盘的重要主要指标是IOPS和吞吐量。

  1. IOPS
    IOPS(Input/Output Per Second)即每秒的输入输出量(或读写次数),即指每秒内系统能处理的I/O请求数量。随机读写频繁的应用,如小文件存储等,关注随机读写性能,IOPS是关键衡量指标。可以推算出磁盘的IOPS = 1000ms / (Tseek + Trotation + Transfer),如果忽略数据传输时间,理论上可以计算出随机读写最大的IOPS。

  2. 吞吐量
    指单位时间内可以成功传输的数据数量。顺序读写频繁的应用,如视频点播,关注连续读写性能、数据吞吐量是关键衡量指标。它主要取决于磁盘阵列的架构,通道的大小以及磁盘的个数。不同的磁盘阵列存在不同的架构,但他们都有自己的内部带宽,一般情况下,内部带宽都设计足够充足,不会存在瓶颈。磁盘阵列与服务器之间的数据通道对吞吐量影响很大,比如一个2Gbps的光纤通道,其所能支撑的最大流量仅为250MB/s。最后,当前面的瓶颈都不再存在时,硬盘越多的情况下吞吐量越大。

操作系统(Linux)也对I/O做了一些优化,

B+树


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!