Сегодня я столкнулся с вопросом эффективности поиска для больших наборов, и я сделал все возможное, чтобы свести его к самому основному случаю.Я чувствую, что такого рода вещи, вероятно, относятся к какой-то классической проблеме или базовой концепции, которую я упускаю, поэтому указатель на это был бы великолепен.
Предположим, у меня есть определение таблицы, например
CREATE TABLE foo(
id int,
type bool,
reference int,
PRIMARY KEY(id),
FOREIGN KEY(reference) REFERENCES foo(id),
UNIQUE KEY(reference)
) Engine=InnoDB;
Заполняется n строками, где n / 2 - случайным образом назначенный тип = 1.Каждая строка ссылается на другой с тем же типом , за исключением первого, который имеет ссылку = 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?