如何查找查询所需的块传输和查找操作的数量

时间:2013-12-22 14:22:20

标签: mysql sql database performance data-storage

我有一个选择和比较的查询。使用给定数量的元组,磁盘块和索引类型(例如密钥上的主B +树索引),如何计算完成查询所需的块传输和查找操作的数量?让我们说,

select cid
from payment
where eid = 1200 and amount > 30

,我们知道eid的值均匀分布在1到100之间,并且amount的值均匀分布在1到50之间.15000个磁盘块中包含1000000个元组。

具体而言,给定的案例是:

没有索引,eid上的主要B +树索引,数量上的主要B +树索引,eid上的次要B +树索引,数量上的次要B +树索引。

eid是员工的主键,cid是客户的主键,cid和eid创建了支付的候选键。金额是付款的属性。

2 个答案:

答案 0 :(得分:2)

好的,我已经找到了那些想要通过使用B +树或其他结构的索引来学习通过数据库查询进行块传输的基础知识的人的实用解决方案。

如果没有定义索引来搜索值,则需要在辅助磁盘上驻留所有数据块和块。因此,将传输所有块并按顺序搜索值。足以知道我们的数据块在磁盘上从哪个地址开始,然后按照我的压力顺序搜索值。因此,根据我们的示例,在查询期间将传输15000个块。 1寻求就足够了。

如果eid上有主要的主要B +树索引,那么我们可以从给定的查询中做出两个假设:

首先,B +树搜索eid = 1200并且找不到值为1200的eid,因为eid在0-100之间。因此,在磁盘中没有块传输和搜索,因为我们首先从B +树中搜索确保磁盘中没有这样的值。

其次,如果我们假设有100个唯一分布的eid值,其中一个是1200,那么B +树将在搜索eid = 1200时成功。在这种情况下,值为1200的叶子上的指针指向eid值为SORTED的磁盘位置,而指向地址是eid = 1200的第一个地址。通过从该地址开始,搜索数据直到eid不再是1200.我们的近似假设是,因为有100个唯一的eid值并且有15000个块。 eid = 1200的元组将在大约15000/100 = 150个块中。我们划分了块的总数,因为我们知道值是排序的,因为我们的索引是主键。因此,如果我们知道eid具有其第一个1200值的地址,我们绝对确定以下元组也将具有eid = 1200,只要我们没有看到eid属性具有不同的值。因此,如果主索引是eid并且1次搜索足够,则将传输150个块,因为当我们开始搜索时没有必要再次搜索磁盘时,我们可以按顺序搜索元组,直到eid在磁盘中具有不同的值。

类似地,如果我们有一个金额的主要指数,并且我们想要金额= [31,50]的值,我们将需要转移(15000/50)* 20 = 6000个区块。我们除以50,因为我们可以有50个不同的金额值。并且我们将除法乘以20,因为我们将搜索这50个值中的20个而不是1.因此,这20个不同的量值可以是6000个元组。再一次寻找就足够了,当我们开始从起始地址搜索时,我们将按顺序查看元组。

如果索引是次要的,那么我们就不能再说这些值在磁盘中排序了。来自B +树的叶节点的指针指向一个存储桶,该存储桶包含指向磁盘上值的实际位置的指针。所以我们先去地址桶,然后从那里直接访问磁盘。因此,我们的第一次搜索是从B +树到桶,然后从桶到磁盘。请注意,在最坏的情况下,您想要的所有值都可以放在完全不同的块中。因此,我们可能需要传输块与包含我们定义的值的元组总数一样多。

如果存在辅助索引eid且值在0-100之间,则再次没有I / O,因为eid = 1200将不存在此值。但是,如果我们再次对eid值进行第二次假设,那么我们现在大致假设可以​​有1000000/100 = 10000个元组包含值为1200的属性eid。在最坏的情况下,如果最坏的话,我们将需要传输10000个块。没有元组按顺序出现,并且位于不同的块中。我们再次需要10000次搜索来查找存储桶指向的磁盘上的位置。

如果有一个二级索引,我们需要20个,这些值大约是(1000000/50)* 20 = 400000元组。在最坏的情况下,如果我们假设一个块被传输时,我们可能需要传输400000块,下一个所需的元组永远不会在最后传输的块中。对于这种情况,在最坏的情况下,我需要400000块转移和400000寻求,因为我强调了上述原因。

我们可以在搜索索引量时选择eid = 1200,反之亦然。因此,我们不关心第二个条件,即在搜索索引量> = 30时查找eid = 1200,或者在搜索索引eid = 1200时查找量> = 30。

再次这些是近似的,并且通常是最坏情况的结果,用于解释块传输的基础知识和查询时的查找。它提供了有关如何从磁盘到主存储器和用户处理数据传输的基本概念。

答案 1 :(得分:0)

虽然我投票结束了这个问题,但我确实想发表一些评论太长的评论。

您的基本问题是“如何计算完成查询所需的块传输和查找操作的数量?”,这是不确定的。此类操作的数量取决于数据库的状态。特别是,数据页和索引页是否已经缓存在内存中。

对于给出的陈述,我认为世界上99.999%的人需要知道的唯一重要的事情是payment(eid, amount, cid)上的索引是最佳索引。索引的前两个元素(按顺序)支持where子句。最后一个允许索引覆盖查询,因此不需要使用原始数据表。索引的具体类型似乎完全不重要。