SQL查询执行时间太长
问题描述:
我目前正在研究一个项目,该项目需要我扫描Public Whip Raw Data并返回一个MP名称列表(谁投了一个匹配已输入关键字的策略,例如“fox狩猎)当前的SQL查询大约需要30秒才能完成执行,这太长了。SQL查询执行时间太长
这是查询“距离”表和“策略”表中的SQL查询(这是什么花费太长时间执行)
$sql = "SELECT DISTINCT distance.mp_id from distance WHERE distance.distance < 0.2 AND distance.dream_id IN (SELECT dream_id from policy WHERE UPPER(policy.title) LIKE UPPER('%".$keyword."%')) ORDER BY distance.distance LIMIT 5";
这是只是呼应的出MP名称代码的其余部分
$results = mysql_query($sql);
echo "<ul>";
while ($row = mysql_fetch_array($results)) {
$mpid = $row['mp_id'];
$sql = "SELECT mp.first_name,mp.last_name FROM mp WHERE mp_id = ".$mpid;
$result = mysql_query($sql);
$result = mysql_fetch_assoc($result);
echo "<li>".$result['first_name']." ".$result['last_name']."</li>\n";
}
echo "</ul>";
答
这是您的查询:
SELECT DISTINCT distance.mp_id
from distance
WHERE distance.distance < 0.2 AND
distance.dream_id IN (SELECT dream_id
from policy
WHERE UPPER(policy.title) LIKE UPPER('%".$keyword."%')
)
ORDER BY distance.distance
LIMIT 5;
在MySQL的一些版本中,in
使用子查询效率不高。我还假设mp_id
对于表distance
是唯一的。该查询可能会更好地工作:
SELECT d.mp_id
from distance d
WHERE d.distance < 0.2 AND
exists (select 1
from policy p
where UPPER(p.title) LIKE UPPER('%".$keyword."%') and
p.dream_id = d.dream_id
)
ORDER BY d.distance
LIMIT 5;
此查询将得到进一步改善具有上policy(dream_id)
并可能distance(distance)
的索引。
根据政策表的大小,性能的一个主要障碍是表达式UPPER(policy.title) LIKE UPPER('%".$keyword."%')
。如果你的意思是平等,那么使用平等而不是带有通配符的like
。如果您确实在title
列中存储了多个关键字,请考虑将其分解为单独的表格或使用全文搜索。
您能否解释“d.distance”中的d和“p.title”中的p来自哪里? – viralpickaxe
@viralpickaxe。 。 。这些是表别名。它们是自连接和子查询所需要的。在其他情况下(如这样),它们使查询更具可读性。 –
非常感谢!响应现在只有1秒。 – viralpickaxe