MySQL新加入的查询在子查询中占用太长时间

时间:2014-10-16 19:58:23

标签: php mysql sql

我试图弄清楚为什么我的查询花了这么长时间。它通常每次查询大约需要60-90秒,并且会多次执行。

旧查询:

     "select * from $table where type = '".$type."' and transdate >= '".$begdate."' and 
      transdate<='".$enddate."' and customerin (select customer from master
      where targetaccount='Y') ";

新查询:

    $q = "SELECT * FROM activity  INNER JOIN custactivities ON 
    activity.activityID = custactivities.activityID  WHERE  type  = '$type'  AND  
    transdate BETWEEN '$begdate' AND '$enddate'  AND  custnum  IN 
    (SELECT customer FROM master WHERE targetaccount = 'Y')  
    GROUP BY custactivities.customer";

原始查询大约需要0.15秒,每次查询新查询大约需要60-90秒。

这确实有一些PHP,但查询问题就是问题。

非常感谢任何建议。

2 个答案:

答案 0 :(得分:2)

如果您没有

,请将索引添加到以下列
activityID on both table
type - if it's numeric, don't use the '
transdate
targetaccount - if you can, use numeric, or enum definition for that column for better indexing

如果您的主表格不是那么大的targetaccount =&#39; Y&#39;,您可以将它与另一个查询分开,使用php获取并使用implode将数组插入您的查询,而不是使用子查询。

并且永远不要像克里斯提到的那样使用*。

这是一个带有php和mysql的小代码片段

$cust = array();
$sql = 'SELECT customer FROM master WHERE targetaccount = "Y"';
$query = mysql_query();
if ($query) {
    while ($row = mysql_fetch_row($query)) {
        $cust[] = $row[0]
    }
}

$sql = "select * from $table where type = '".$type."' and transdate >= '".$begdate."' and 
      transdate<='".$enddate."'" . (count($cust) ? ' AND custnum IN ('.implode(', ', $cust).')' : '');

我还没有接受过测试,但我认为现在你明白了这一点。

答案 1 :(得分:1)

你能加入'掌握'吗?我认为这会加快速度。你减速很可能是次选。另外,仅仅为了内存管理,你可能不想只为你需要的列做'SELECT *'而是'SELECT col1,col2'。