MySQL Union查询需要花费太多时间来执行

时间:2014-10-10 10:05:54

标签: php mysql database

我正在尝试从处理不同表和数据库的不同查询中获取单个MySQL查询结果,这是我的表结构,包含数据库名称:

数据库ads1 - 表:clicks_214requests

数据库ads2 - 表:clicks_255requests

数据库ads3 - 表格:clicks_256requests

这是我正在尝试执行的查询

$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结果: enter image description here

1 个答案:

答案 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());