Эффективный запрос к базе данных навалом - PullRequest
0 голосов
/ 10 августа 2011

У меня есть php-страница, на рендеринг которой уходит 2,8 секунды. Страница содержит скрипт, который читает текстовый файл через file() строка за строкой (~ 5000 строк) через цикл foreach. Это прекрасно работает и позволяет мне обернуть каждую строку в <div>. Это все выглядит примерно так.

$text_file = 'path/to/my/text/file.txt';
$lines = file($text_file);
$output = '';
foreach($lines as $line_num => $line){
  $output .= '<div id="'.$line_num.'" class="line">'.htmlspecialchars($line).'</div>'."\n";
}
echo $output;

Проблема в том, что мне нужно запросить , есть ли номер строки в базе данных и назначить ли ей дополнительный класс highlight. Это то, что заставляет страницу отображаться так медленно. Каждая строка (~ 5000) запрашивает базу данных в цикле. Это выглядит примерно так.

foreach($lines as $line_num => $line){
  // codeigniter is being used here
  $line_exists = $this->line_model->lookup_line($line_num);
  // $line_exists checks the database if the $line_num exists it will return true / false
  if($line_exists){          
    $lines_output .= '<div id="'.$line_num.'" class="line highlight">'.htmlspecialchars($line).'</div>'."\n";
  }else{
    $lines_output .= '<div id="'.$line_num.'" class="line">'.htmlspecialchars($line).'</div>'."\n";
  }
}

Мой вопрос : есть ли более эффективный / быстрый способ сделать это?

Ответы [ 2 ]

0 голосов
/ 10 августа 2011
<?
$text_file = 'path/to/my/text/file.txt';
$lines = file($text_file);

$lineNumbers = array_keys($lines);


$sql = "SELECT id FROM table where lineNumber IN( '".implode("','",$lineNumbers)."' )";
//exicute this line get id in array format, lets say $availableLines varialbe 
//$availableLines

foreach($lines as $line_num => $line){
  // codeigniter is being used here
//compare if current line number exits in $availableLines variable
  if(in_array($line_num,$availableLines)){          
    $lines_output .= '<div id="'.$line_num.'" class="line highlight">'.htmlspecialchars($line).'</div>'."\n";
  }else{
    $lines_output .= '<div id="'.$line_num.'" class="line">'.htmlspecialchars($line).'</div>'."\n";
  }
}
0 голосов
/ 10 августа 2011

Я не уверен, что именно эта функция проверяет в базе данных, но одна идея ускорить процесс может заключаться в том, чтобы получить номера строк в базе данных ДО цикла foreach. Получите все номера строк в массиве, внутри цикла просто проверьте, находится ли номер строки в массиве, если это так, используйте выделение, иначе нормальный случай. Таким образом, вы запрашиваете базу данных только один раз, а не ~ 5k раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...