MySQL的联合查询花费过多的时间来执行
我想从不同的表和数据库工作不同的查询一个MySQL查询结果,这是我的表结构的数据库名称: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分钟即可获得结果。有没有办法做得更快?
一)你不应该做出这样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());
我已经为所有数据库设置了索引,并且从15分钟到5分钟的执行时间都有所改进......但是,我知道我的想法并不是最好的,但我只是想加快速度,你认为temp_table应该可以提高性能? – CapitanFindus 2014-10-10 14:48:49
从我的经验 - 是的。 TEMP表格将允许您创建中间层并优化查询。首先,您将创建一个适合您进行这种聚合查询的数据库,然后您将数据分组。 – Artjoman 2014-10-13 08:36:48
哪里藏起来从何而来?另外,我敢问你为什么有多个数据库和表? – Strawberry 2014-10-10 12:39:21
Hid来自另一个仅用于比较请求的表。我有多个数据库和表,因为数据记录的数量很大,但表结构是相同的;不同数据库之间的唯一区别是“click”表,它可以改变每个数据库的名称($ table变量) – CapitanFindus 2014-10-10 13:09:37
您可以在MySQL窗口中执行查询并发布EXPLAIN? – 2014-10-10 13:43:50