zoukankan      html  css  js  c++  java
  • 索引优化数据库(原理篇)

    如图,这是一张有一百行数据的employee数据表。

    假设每行占128Bytes,那么存入磁盘的时候,是怎么存储的呢?

    磁盘由磁道和扇区组成,磁盘和扇区组成一个基本的存储单位,我们称之为“块”,块的存储空间一般默认为512Bytes。

    刚才的employee数据表有一百行,每行128Bytes,那么就要占用(100*128)/512 = 25个块。

    如果我们想要查询某个员工的信息,比如查询名字为张三的员工,大约需要访问多少个块呢?

    答案是:最少访问一个块,最多访问25个块。

    我们在考虑问题的时候要做最坏的打算,所以这里我们认为是访问25个块。

    我们知道,读取磁盘的时候,我们是需要旋转磁盘来确定其扇区,通过前后移动磁头来确定其磁道,这样就能定位到一个具体的块。

    可以想象,这样的读取速度是很慢的,而且要读取很多个块,才能查找到一条信息,对于现在的大企业来说,信息可能不止我这里的100行,可能是上万行,十万行....那么怎样才能优化查询的速度呢?这里我们就引入了索引。

    下图我们建立了一个索引,并且假设索引表的每行占16Bytes,那么索引表1需要存入1个块当中,索引表2需要存入(16*100)/512<4,所以要存入四个块当中。

    回到例子中,我们要查询的张三的employeeID=66,我们先查找索引表1,可以得到它在索引表2中的位置,进而就访问到了张三的信息所在的块。

    这里,访问索引表1和索引表2各访问一次块,最后查找张三信息也访问了一次块,因此总共只访问了3次块。

    并且这个访问块的次数是稳定的,不管查询哪条信息,都是3次。

    所以我们可以看到,为数据表建立索引提升了查询速度。

    在实际操作中,我们可以用B树或者B+树来实现这一操作。

    这篇文章只是理论介绍,具体实操,不知道啥时候会做。。。

  • 相关阅读:
    事件总线demo
    软件架构分类(转载)
    ASP.NET MVC 使用 Datatables (2)
    ASP.NET MVC 使用 Datatables (1)
    查看win10的激活信息和版本号
    2016年工作计划
    通俗粗暴的事件委托理解
    matplotlib系列——条形图
    matplotlib系列——折线图
    使用pip安装python模块和包
  • 原文地址:https://www.cnblogs.com/xxxxxiaochuan/p/12927275.html
Copyright © 2011-2022 走看看