我试图从处理不同表和数据库的不同查询中获得单个MySQL查询结果,这是我的带有数据库名称的表结构:
数据库ads1-表:clicks_214,requests
数据库ads2-表:clicks_255,requests
数据库ads3-表:clicks_256,requests
这是我试图执行的查询
$query="";
for($i=1;$i<4;++$i)
{
$this->db_num=$i;
$this->selectDB($i);
$table=$this->getTableName();
$db=$this->getDatabaseName();
$query.="(SELECT r.kwd, count(c.rid) as cnum, count(r.kwd) as rnum
FROM $db.requests r LEFT JOIN $db.$table c ON r.id=c.rid
WHERE hid='$hid'
AND r.time BETWEEN '$date1 $hour1:00:00' AND '$date2 $hour2:59:59'
GROUP BY r.kwd
ORDER BY cnum DESC
LIMIT $limit,50)";
if($i<3)
{
$query.=" UNION ";
}
}我肯定这不是最好的方法,因为我需要等待大约5分钟才能得到结果。有什么办法能更快地做到这一点吗?我已经为所有的3个DB设置了索引
这是一个解释的结果:

发布于 2014-10-10 13:48:38
a)您不应该进行这种跨数据库查询。使用您的DB结构,运行3个独立的查询并使用一些简单的脚本组合结果,或者在其中一个数据库中创建一个临时表,您可以在其中一个数据库中组合来自其中每一个数据库的数据,这样做更合适。
( b)在大型数据库上设置了一些索引,以提高检索速度。但这不是解决办法..。
您可以尝试使用临时表:
$this->selectDB('temptableDB');
$maketemp = "
CREATE TEMPORARY TABLE temp_table_1 (
`kwd` int ,
`rid` int,
)
";
mysql_query($maketemp, $connection) or die ("Sql error : ".mysql_error());
for($i=1;$i<4;++$i)
{
$this->db_num=$i;
$this->selectDB($i);
$table=$this->getTableName();
$db=$this->getDatabaseName();
$inserttemp = "
INSERT INTO temptableDB.temp_table_1
(`kwd`, `rid`)
SELECT r.kwd, c.rid
FROM $db.requests r LEFT JOIN $db.$table c ON r.id=c.rid
WHERE hid='$hid'
AND r.time BETWEEN '$date1 $hour1:00:00' AND '$date2 $hour2:59:59'
";
mysql_query($inserttemp, $connection) or die ("Sql error : ".mysql_error());
}
$select = "
SELECT kwd, count(rid) as cnum, count(kwd) as rnum
FROM temp_table_1
GROUP BY r.kwd
ORDER BY cnum DESC
";
$export = mysql_query($select, $connection) or die ("Sql error : ".mysql_error());https://stackoverflow.com/questions/26296871
复制相似问题