[英]MySQL Union query taking too much time to execute
我正在嘗試從在不同的表和數據庫上運行的不同查詢中獲取單個MySQL查詢結果,這是我的數據庫名稱表結構:
數據庫ads1
表格: clicks_214
, requests
數據庫ads2
表格: clicks_255
, requests
數據庫ads3
表格: clicks_256
, requests
這是我試圖執行的查詢
$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.