我试图弄清楚为什么我的查询花了这么长时间。它通常每次查询大约需要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,但查询问题就是问题。
非常感谢任何建议。
答案 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'。