MySQL的联合查询花费过多的时间来执行

MySQL的联合查询花费过多的时间来执行

问题描述:

我想从不同的表和数据库工作不同的查询一个MySQL查询结果,这是我的表结构的数据库名称: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分钟即可获得结果。有没有办法做得更快? enter image description here

+0

哪里藏起来从何而来?另外,我敢问你为什么有多个数据库和表? – Strawberry 2014-10-10 12:39:21

+0

Hid来自另一个仅用于比较请求的表。我有多个数据库和表,因为数据记录的数量很大,但表结构是相同的;不同数据库之间的唯一区别是“click”表,它可以改变每个数据库的名称($ table变量) – CapitanFindus 2014-10-10 13:09:37

+0

您可以在MySQL窗口中执行查询并发布EXPLAIN? – 2014-10-10 13:43:50

一)你不应该做出这样crossdatabase疑问:我已经在所有3分的DB

这是一个EXPLAIN结果集索引。使用您的数据库结构,运行3个独立查询并使用一些简单脚本组合结果会更合适。或者在其中一个数据库中创建一个临时表,您可以将这些数据与每个数据库进行组合。

b)On大型数据库提出了一些提高速度的指标。它不是,虽然解...

你可以尝试用临时表玩:

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

我已经为所有数据库设置了索引,并且从15分钟到5分钟的执行时间都有所改进......但是,我知道我的想法并不是最好的,但我只是想加快速度,你认为temp_table应该可以提高性能? – CapitanFindus 2014-10-10 14:48:49

+0

从我的经验 - 是的。 TEMP表格将允许您创建中间层并优化查询。首先,您将创建一个适合您进行这种聚合查询的数据库,然后您将数据分组。 – Artjoman 2014-10-13 08:36:48