目次
ただPointFieldを使用するだけではスピードが出ない
現在、位置情報を使用したシステムを作っていて、そこで100m以内の情報を取ってくる+近距離順にソートする必要性があり、単純にデータ取得+ソートを掛けたところ、indexが効かなく非常に処理が遅かったので、その時の対処方法を残しておきたいと思います。
PointFieldにgeographyオプションを使う
DBはPostgreSQLを使っていることを前提にします。
point = models.PointField(geography=True, verbose_name=u'座標')
最初、何もオプションを設定していなかったのですが、geography
オプションを設定するようにしました。
また、あとからこのオプションを設定した場合、migrationが必要です。
distance_lteをやめてdwithinを使う
Model.objects.distance(point).filter( point__dwithin=(point, D(m=100)) ).order_by('distance')
最初は、dwithin
の変わりにdistance_lte
を指定していたのですが、これだとindexが上手く効かず遅くなる原因になっていました。dwithin
は、PointField
にgeography=True
が設定されていないと使用することが出来ません。
やったことはこれら2つで終わりです。
ですが、これら2つで100倍近くスピードアップし、爆速化することが出来ました。
PointFieldは、あくまで位置情報入れておく箱なので、設定や使い方をちゃんとしないとスピードは出ないのですね。