首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL联合查询执行时间过长

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

Stack Overflow用户
提问于 2014-10-10 10:05:54
回答 1查看 672关注 0票数 0

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

数据库ads1-表:clicks_214requests

数据库ads2-表:clicks_255requests

数据库ads3-表:clicks_256requests

这是我试图执行的查询

代码语言:javascript
复制
$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设置了索引

这是一个解释的结果:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-10 13:48:38

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

( b)在大型数据库上设置了一些索引,以提高检索速度。但这不是解决办法..。

您可以尝试使用临时表:

代码语言:javascript
复制
$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());
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26296871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档