포스트그레스 postgis 속도

레일즈 + PostGIS 조합을 잘 쓰고 있었다.

// migration
add_column :spots, :gps, :point, :geographic=>true , :srid => 4326, :spatial => true

// model
scope :nearby_to, lambda { |spot, distance|
    where("ST_DWithin(gps, ?, ?) AND id != ?", spot.gps, max_distance, spot.id)
}

// controller:
@near_spots = Spot.nearby_to(@spot, 100)

여기까지 하면 문제없이 근처의 스팟들이 잘 뽑아지니까, 아무생각없이 쓰고 있었는데….

로그를 보니… 개발 머신쪽에서 30ms 정도 걸리고 있었다. 일반적인 검색이 1ms 이하로 응답이 나와야하는데! 잠시 검색해보고, 아래 한줄을 migration에 넣어드렸더니 역시 1ms 아래로 속도가 나온다.   

이거 한줄로 30배는 빨라진다!!!

execute "create index index_on_spots_gps on spots using gist (gps);"

교훈은… 로그 자주 보자?