2012-01-09 100 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不支持存储过程,所以这就是为什么我希望避免使用存储过程。然而,那么查询将不会被编译到数据库中,并且计算将不得不在python中完成......等等。django查询和从django调用的存储过程之间的性能有什么区别?

+1

你问了这个问题3次。这是一个交叉点。 – Bytemain 2012-01-10 02:04:16

回答

1

如果您使用Postgis或Mysql Spatial Extensions中的专用数据库函数(与计算python中的所有内容相比)有巨大的性能改进。

看看geodjango,设置有点痛苦,但它拥有您可能需要的任何地理位置。

如果geodjango太多,您可以随时使用raw SQL来进行此特定查询。

+0

我不想使用geodjango,因为您需要的额外组件的设置/数量以及我真的只需要这一个功能的事实......我知道您正在尝试提供帮助,但请回答所提问题第一个 – Derek 2012-01-09 05:56:13

+0

是的,我意识到有一个与Django的原始SQL,以及如何使用它,笏我感兴趣的是执行从Django的原始查询和普通的Django查询之间的性能差异... – Derek 2012-01-09 06:16:15

+1

@Derek:我会如果使用Postgis或Mysql Spatial Extensions,请说一个数量级。否则,更多地取决于数据库服务器和Web服务器的设置。对于数百万条记录,我会将它保留在数据库层,因为不匹配记录的数据传输会很昂贵。 – 2012-01-09 06:23:46