Разница в производительности между запросом django и хранимой процедурой (MySQL)? - PullRequest
2 голосов
/ 09 января 2012

Я хочу использовать запрос, который вычисляет точки, которые находятся на расстоянии D от точки (т. Е. Геолокации), поэтому запрос несколько сложен:

        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 не поддерживает хранимые процедуры, поэтому я надеялся избежать использования хранимых процедур.Однако тогда запрос не будет скомпилирован в БД, а вычисления должны быть выполнены в Python ... и т. Д. В чем разница в производительности между запросом django и процедурой хранилища, вызываемой из django?

1 Ответ

1 голос
/ 09 января 2012

[Изменено] Если вы используете специализированные функции базы данных, такие как в Postgis или Mysql Spatial Extensions, это значительно улучшит производительность по сравнению с вычислением всего в python.

Взгляните на geodjango , настройка довольно болезненная, но в ней есть все, что вам может понадобиться для геолокации.

Если geodjango слишком много, вы всегда можете прибегнуть к raw SQL для этого конкретного запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...