2012-01-09 32 views
2

私は離れて点(すなわち、ジオロケーションのもの)からDの距離にある点を算出するクエリを使用するので、クエリは幾分複雑である:ウェル上記djangoクエリとストアドプロシージャ(MySQL)のパフォーマンスの違いはありますか?

 DELIMITER // 

    CREATE PROCEDURE geodist (IN m_lat double, IN m_lng double, IN dist int, IN lim int) 
    BEGIN 
    DECLARE lon1 double; DECLARE lon2 double; 
    DECLARE lat1 double; DECLARE lat2 double; 

    -- calculate lon lat for the rectangle 
    SET lon1 = m_lon-dist/abs(cos(radians(m_lat))*69); 
    SET lon2 = m_lon+dist/abs(cos(radians(m_lat))*69); 
    SET lat1 = m_lat-(dist/69); 
    SET lat2 = m_lat+(dist/69); 

    -- run query; 
    SELECT post.id, 3956 * 2 * ASIN(SQRT(POWER(SIN((m_lat - post.geo_lat) * pi()/180/2), 2) +COS(m_lat * pi()/180) * COS(post.geo_lat * pi()/180) *POWER(SIN((m_lng - post.geo_lng) * pi()/180/2), 2))) as distance 
    FROM post_post as post 
    WHERE 
    post.geo_lng BETWEEN lon1 AND lon2 
    AND post.geo_lat BETWEEN lat1 AND lat2 
    HAVING distance < dist ORDER BY Distance limit lim; 

    END // 

私のストアドプロシージャがあろうものです。何百万という行のデータではなく、何千もの行を処理するためにこれを使用しているので、ストアドプロシージャでdjangoクエリを使用したときのパフォーマンスがどのようなものになるのだろうか?私はdjangoがストアドプロシージャをサポートしていないことを認識しているので、ストアドプロシージャの使用を避けたいと考えています。しかし、クエリはdbでコンパイルされず、計算はPythonなどで行わなければなりません。djangoから呼び出されるdjangoクエリとストアプロシージャのパフォーマンスの違いは何ですか?

+1

あなたはこの質問を3回しました。これはクロスポストです。 – Bytemain

答えて

1

[編集] PostgisやMysql Spatial Extensionsのような特殊なデータベース機能を使用すると、Pythonのすべてを計算する場合に比べてパフォーマンスが大幅に向上します。

geodjangoをご覧ください。設定はやや苦痛ですが、ジオロケーションに必要なものはすべてあります。

geodjangoが多すぎる場合は、この特定のクエリでいつでもraw SQLにアクセスできます。

+0

私はgeodjangoを使用しないことを望んでいます。必要な余分なコンポーネントの数/数と、実際にはこの機能を1つだけ必要とするという事実があります。私はあなたの助けを求めていますが、最初に – Derek

+0

はい、私はそこには、djangoの生のSQLとそれを使用する方法を、私は関心があるワットは、djangoからの生のクエリと通常のdjangoのクエリを実行する間のパフォーマンスの違いです... – Derek

+1

@Derek:私はPostgisまたはMysql Spatial Extensionsを使用している場合は、およそ1桁程度です。それ以外の場合は、データベースサーバーとWebサーバーの設定によります。何百万ものレコードでは、一致しないレコードのデータ転送にはコストがかかるため、データベースレイヤーに保管します。 –

関連する問題