2014-10-10 171 views
0

我想從不同的表和數據庫工作不同的查詢一個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

回答

1

一)你不應該做出這樣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