我正在尝试从处理不同表和数据库的不同查询中获取单个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上设置了索引
这是一个EXPLAIN结果:
答案 0 :(得分:1)
a)您不应该进行此类跨数据库查询。使用您的数据库结构,运行3个独立查询并使用一些简单的脚本组合结果或者在其中一个数据库中创建临时表,您可以在其中组合来自每个数据的数据
更合适b)在大型数据库上放置一些索引来提高速度。虽然不是解决方案......
您可以尝试使用Temp表:
$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());