php循环语句里select效率问题
我遇到的问题是海量数据的表,每个表大约百万条,每天会生成一个表。
我查询的时候是这样写的 在foreach 循环里写sql语句:
$tableArr是表数组,如果查询的是1到3号的数据 这个数组是
array([0]=>table_20101001,[1]=>table_20101002,[2]=>table_20101003)
foreach($tableArr AS $table)
{
$sqlCnt ="SELECT COUNT(*) FROM $table h"
." WHERE ". $where;
$total += $tabcnt[$table] = $this->_gdb -> fetchOne($sqlCnt);
}
这样写把每个表的记录数加起来,最后$total是总记录数用于分页
再下面也是循环写的:
foreach($tableArr AS $k => $table)
{
$cntArr[] = $tabcnt[$table];
$sqlT = "SELECT CONCAT(h.id,'-$table') AS it,FROM_UNIXTIME(h.time) AS fmtdate,h.src_ip,h.url,"
." (h.ul_flux + h.dl_flux) AS totalflux, h.user_id, h.rule_id FROM $table h"
." WHERE ".$where. " ORDER BY h.time DESC LIMIT $offset,".$limit;
$data = $this->_gdb -> fetchAll($sqlT);
$res = array_merge($res, $data);
$cnt = count($data);
$cnts += $cnt;
if ($cnts >= _DATA_PER_PAGE_LOG)
{
break;
}
else
{
$limit = _DATA_PER_PAGE_LOG - $cnt;
if ($cnt > 0 && $cnt <= _DATA_PER_PAGE_LOG)
{
$offset = 0;
continue;
}
else
{
$offset = (array_sum($cntArr)) - ($page-1)*_DATA_PER_PAGE_LOG;
$offset = $offset > 0 ? $offset : -$offset;
}
}
}
return $res;
}
不知道这么写的效率和用union联合的一条sql语句查询的效率哪个高?请高手赐教!
另外我写这段代码:
$cnt = count($data);
$cnts += $cnt;
if ($cnts >= _DATA_PER_PAGE_LOG)
{
break;
}
else
{
$limit = _DATA_PER_PAGE_LOG - $cnt;
if ($cnt > 0 && $cnt <= _DATA_PER_PAGE_LOG)
{
$offset = 0;
continue;
}
else
{
$offset = (array_sum($cntArr)) - ($page-1)*_DATA_PER_PAGE_LOG;
$offset = $offset > 0 ? $offset : -$offset;
}
}
的目的是减少循环时多个表之间的衔接问题,比如第一个表数据记录数不满足每页显示的数目那么第二表该从哪里(limit m,n)查起,大家有没有好的方法?