2016-03-26 90 views
0

为了解释下面的查询,你应该知道,我有,它们会在查询中使用当前用户的三个变量...慢速查询...需要更快

$radius偏好的用户想要搜索的

$lat用户的纬度

$lon用户的经度

在zipData表中的相关列是zipcodelonlat

我有这个疑问这将正常工作所需的半径内报告的所有其他用户...

$query=" 
    SELECT username FROM zipData,seekers 
    WHERE (POW((69.1*(lon-\"$lon\")*cos($lat/57.3)),\"2\")+POW((69.1*(lat-\"$lat\")),\"2\"))<($radius*$radius) 
    AND replace(seekers.postal,' ','') = zipData.zipcode; 
"; 

我也有此查询仅返回特定用户符合某些条件......

$query=" 
    SELECT * 
    FROM 
    (
     SELECT a.username, MATCH(a.highlight) AGAINST (\"{$keywords}\" IN BOOLEAN MODE) AS score 
     FROM resume_highlights a 
     JOIN seekers ON a.username = seekers.username and seekers.resume_status = 1 
     HAVING score>0 

      UNION ALL 

     SELECT b.username, MATCH(b.skill,b.skill_list) AGAINST (\"{$keywords}\" IN BOOLEAN MODE) AS score 
     FROM resume_skills b 
     JOIN seekers ON b.username = seekers.username and seekers.resume_status = 1 
     HAVING score>0 

      UNION ALL 

     SELECT c.username, MATCH(c.education_title,c.education_organization) AGAINST (\"{$keywords}\" IN BOOLEAN MODE) AS score 
     FROM resume_education c 
     JOIN seekers ON c.username = seekers.username and seekers.resume_status = 1 
     HAVING score>0 

      UNION ALL 

     SELECT d.username, MATCH(d.employer_title,d.employer_organization) AGAINST (\"{$keywords}\" IN BOOLEAN MODE) AS score 
     FROM resume_employer d 
     JOIN seekers ON d.username = seekers.username and seekers.resume_status = 1 
     HAVING score>0 

      UNION ALL 

     SELECT e.username, MATCH(e.volunteer_title,e.volunteer_organization) AGAINST (\"{$keywords}\" IN BOOLEAN MODE) AS score 
     FROM resume_volunteer e 
     JOIN seekers ON e.username = seekers.username and seekers.resume_status = 1 
     HAVING score>0 

    ) AS X 
    ORDER BY score desc 
"; 

这两个查询都独立工作;然而,我将它们组合成一个查询所做的每一次尝试都会导致执行时间非常缓慢。

UPDATE

我做对seekers.postalzipData.lonzipData.lat指标。我本以为会做的伎俩,但它没有。这可能只是因为我构建的查询很糟糕,所以我想查看两个查询应该如何组合。

回答

1

我觉得这link有你的答案:

改善SELECT操作的性能,最好的办法是 一个或多个被在 查询测试的列创建索引。索引条目的作用与指向表行的指针类似,允许查询快速确定哪些行与WHERE子句中的条件相匹配,并检索这些行的其他列值。所有的 MySQL数据类型都可以被索引。

+0

我确实有索引上的seekers.postal zipData.lon和zipData.lat我会假设会做的伎俩,但它没有。这可能只是因为我构建的查询很糟糕,所以我想看看在初始文章中的2个查询应该如何组合。 –

+0

我不推荐'拥有',而是在返回行之前建议'where'限制结果集。 –

相关问题