有效地批量查询数据库

时间:2011-08-10 00:51:49

标签: php codeigniter

我有一个PHP页面需要2.8秒才能渲染。该页面包含一个脚本,该脚本通过file()循环通过foreach逐行(~5000行)读取txt文件。这非常有效,并且允许我将每一行包裹在<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 :(得分:0)

我不确定该函数究竟在数据库中检查了什么,但加快速度的一个想法可能是在foreach循环之前获取数据库中的行号。获取数组中的所有行号,在循环内只检查行号是否在数组中,如果是,则使用突出显示,否则为正常情况。这样,您只需查询一次数据库,而不是~5k次。

答案 1 :(得分:0)

<?
$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";
  }
}