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列中存储了多个关键字,请考虑将其分解为单独的表格或使用全文搜索。

+1

您能否解释“d.distance”中的d和“p.title”中的p来自哪里? – viralpickaxe

+1

@viralpickaxe。 。 。这些是表别名。它们是自连接和子查询所需要的。在其他情况下(如这样),它们使查询更具可读性。 –

+1

非常感谢!响应现在只有1秒。 – viralpickaxe