簡體   English   中英

MySQL Union查詢執行時間過多

[英]MySQL Union query taking too much time to execute

我正在嘗試從在不同的表和數據庫上運行的不同查詢中獲取單個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上設置了索引

這是一個解釋結果: 在此處輸入圖片說明

a)您不應進行此類跨數據庫查詢。 使用您的數據庫結構,運行三個獨立的查詢並使用一些簡單的腳本合並結果更為合適,或者在其中一個數據庫中創建一個臨時表,您可以在其中合並每個數據庫中的數據

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM