今天我遇到了一个关于大型数据集的搜索效率的问题,我已经完成了将它归结为最基本的案例。我觉得这种事情可能涉及一些经典问题或者我缺少的基本概念,所以指向这个的指针会很棒。在大型数据集中递归搜索索引的性能
假设我有像
CREATE TABLE foo(
id int,
type bool,
reference int,
PRIMARY KEY(id),
FOREIGN KEY(reference) REFERENCES foo(id),
UNIQUE KEY(reference)
) Engine=InnoDB;
与其中n/2是随机分配的类型= 1 n行填充的表定义。每行都引用另一个及其相同类型,除了第一个引用= null。
现在,我们要打印与类型1.我认为在某些时候,它会更快地递归调用类似
function printFoo1($ref){
if($ref==null)
return;
$q = 'SELECT id, reference FROM foo WHERE id='.$ref;
$arr = mysql_fetch_array(mysql_query($q));
echo $arr[0];
printFoo1($arr[1]);
}
与之相对
function printFoo2($ref){
$q = 'SELECT id FROM foo WHERE type=1';
$res = mysql_query($q);
while($id = mysql_fetch_array($res)){
echo $id[0];
}
}
主要的所有项目这里指的是函数1搜索被索引的“id”,而函数2必须进行n/2次比较而不会导致命中,但是多个查询的开销将远远大于单个SELECT。
我的假设是否正确?如果是这样,在函数1优于函数2之前,我们需要多大的数据集?
我认为甲骨文基于成本的优化器至少将占到其更好地根据当前的表统计... – Randy 2011-06-06 21:16:25
@Randy谢谢,我对此并不熟悉。我会看看。 – Matt 2011-06-06 21:31:07
这段代码是一个SQL注入漏洞:''SELECT id,引用FROM foo WHERE id ='。$ ref;',将其改为'“SELECT id,引用FROM foo WHERE id ='$ ref';”'请注意使用单引号。没有那些你的'mysql_real_escape_string()'将不起作用。 – Johan 2011-06-06 21:35:28