2016-03-26 4 views
0

がクエリ以下に説明すると、ユーザが検索したいスロークエリは、... ...あなたは、私は、クエリに慣れる現在のユーザーのための3つの変数を持っていることを知っている必要があり、それはより速く

$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 
"; 

両方のクエリが独立して動作します。しかし、それらを1つのクエリに結合しようとすると、実行時間が非常に遅くなります。私はseekers.postalzipData.lonzipData.latのインデックスを持っている

UPDATE

。私はそのトリックを行うだろうと仮定していただろうが、それはしませんでした。 2つのクエリをどのように組み合わせるべきかを知りたいので、クエリを作成しただけでよいかもしれません。私は、これはlinkは、あなたの答えを持っていると思う

答えて

1

SELECT操作のパフォーマンスを改善するための最善の方法は にあるが クエリでテストされている1つ以上の列に索引を作成します。インデックスエントリは、テーブル行へのポインタのように機能し、 クエリで、 WHERE句の条件に一致する行を迅速に判断し、それらの行の他の列値を取得できます。すべて MySQLデータ型のインデックスを作成できます。

+0

私はseekers.postal zipData.lonとzipData.latにインデックスを持っていますが、それはトリックを行うと仮定していましたが、そうではありませんでした。最初の投稿の2つのクエリがどのように組み合わされるべきかを見たいので、クエリを作成したことがあるかもしれません。 –

+0

'having'を使う代わりに、' where'は結果セットを制限して行を返すことをお勧めします。 –