Php MySQL联合查询执行时间过长

Php MySQL联合查询执行时间过长,php,mysql,database,Php,Mysql,Database,我试图从不同的表和数据库上的不同查询中获得一个MySQL查询结果,这是我的数据库名称表结构: 数据库ads1- 表:点击214,请求 数据库ads2- 表:单击按钮,请求 数据库ads3-表:单击\u 256,请求 这就是我试图执行的查询 $query=""; for($i=1;$i<4;++$i) { $this->db_num=$i; $this->selectDB($i); $table=$this->getTableName();

我试图从不同的表和数据库上的不同查询中获得一个MySQL查询结果,这是我的数据库名称表结构:

数据库ads1- 表:点击214,请求

数据库ads2- 表:单击按钮,请求

数据库ads3-表:单击\u 256,请求

这就是我试图执行的查询

$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个数据库上设置了索引

这是一个解释结果:
a您不应该进行这种跨数据库查询。在数据库结构中,更适合运行3个独立的查询,并使用一些简单的脚本组合结果,或者在其中一个数据库中创建一个临时表,在其中可以组合来自其中每个数据库的数据

在大型数据库上放置一些索引以提高速度。但这不是解决办法

您可以尝试使用临时表:

$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());

hid来自哪里?还有,我敢问为什么有多个数据库和表?Hid来自另一个仅用于比较请求的表。我有多个数据库和表,因为数据记录量很大,但表结构相同;不同数据库之间唯一的区别是click table,正如您所看到的,它会更改每个数据库$table变量的名称。您可以在MySQL窗口中执行查询并发布解释吗?您看过分区吗?@草莓从来没有听说过:/I我已经设置了索引,所有数据库都一样,它的执行时间从15分钟提高到了5分钟。。。然而,我知道我的想法不是最好的,但我只是想加快速度,你认为临时表应该提高性能吗?根据我的经验-是的。临时表将允许您创建中间层并优化查询。首先,您将创建一个适合于进行所需聚合查询的数据库,然后对数据进行分组。