[SQL] 데이터베이스 / SQL : 어떻게 위도 / 경도 데이터를 저장하는 방법?
SQL데이터베이스 / SQL : 어떻게 위도 / 경도 데이터를 저장하는 방법?
성능 질문 ...
나는 위치 정보 데이터 (경도 및 위도)가 주택의 데이터베이스를 가지고있다.
내가 뭘 원하는 내가 사이에있는 모든 홈 기록을 반환하고있어 쿼리를 많이 수행 할 수 있도록 InnoDB의 데이터베이스 엔진을 사용하여 내 MySQL을 (v5.0.24a)에 장소의 데이터를 저장하는 가장 좋은 방법을 찾을 수있다 X1 및 X2는 위도 및 경도 Y1 및 Y2.
지금, 내 데이터베이스 스키마입니다
---------------------
Homes
---------------------
geolat - Float (10,6)
geolng - Float (10,6)
---------------------
그리고 내 쿼리는 다음과 같습니다
SELECT ...
WHERE geolat BETWEEN x1 AND x2
AND geolng BETWEEN y1 AND y2
업데이트 : 답변이없는 정지
나는 아래의 3 개 가지 답이있다. 한 사람이 사용 플로트를 말한다. 한 사람이 INT를 사용했다. 한 사람이 공간을 사용했다.
내가 MySQL을 사용하도록 SQL 실행 속도를 측정 할 수있는 문을 "EXPLAIN". SQL 실행 (결과 집합 페칭)의 절대적 차이가 존재한다는 것을 표시 경도 및 위도 데이터의 형태 또는 INT FLOAT를 사용하는 경우 ..
또한 나타나 사용하여 문이 훨씬 더 빨리 ">"또는 "<"SQL 문을 사용하는 것보다 "BETWEEN". 그것은 "BETWEEN"거의 3 배 빠른 사용에있어은 ">"와 "<"문을 사용하는 것보다.
그 존재가 말한다면, 난 여전히 성능에 미치는 영향이 어떻게 될지에 unceratin 생각이 MySQL을 내 버전 실행 (v5.0.24)로 지원되는 경우에는이 지원되는 경우 내가 그것을 가능하게하는 방법뿐만 아니라 ... 나에게 불분명하기 때문에 공간을 사용하는 경우 .
어떤 도움을 크게 감상 할 수있다
해결법
-
==============================
1.플로트 (10,6)는 잘입니다.
플로트 (10,6)는 잘입니다.
다른 복잡한 저장 방식은 밖으로 더 많은 번역을 필요로하고, 부동 소수점 연산은 충분히 빠릅니다.
-
==============================
2.난 당신이 MySQL의에 대한 요구하는지 알고 있지만, 공간 데이터가 비즈니스에 중요한 경우에, 당신은 재고 할 수 있습니다. PostgreSQL의 + PostGIS와는 무료 소프트웨어이며, 그들은 효율적으로 공간 및 지리 데이터를 관리하기위한 좋은 평판을 가지고있다. 많은 사람들이 때문 만 PostGIS와의 PostgreSQL을 사용합니다.
난 당신이 MySQL의에 대한 요구하는지 알고 있지만, 공간 데이터가 비즈니스에 중요한 경우에, 당신은 재고 할 수 있습니다. PostgreSQL의 + PostGIS와는 무료 소프트웨어이며, 그들은 효율적으로 공간 및 지리 데이터를 관리하기위한 좋은 평판을 가지고있다. 많은 사람들이 때문 만 PostGIS와의 PostgreSQL을 사용합니다.
그래서 아마도 그것은 귀하의 사용 사례에 대해 충분히 잘 작동 많은 비록 MySQL의 공간 시스템에 대한 모른다.
-
==============================
3.하나의 최적화 - 여기 "공간"보다 다른 데이터 유형을 사용하는 문제는 "사각형 선택"의 네 종류의 수 (와 MySQL이 확실히 일반적으로 밝은 아닌 보통이 얼마나 밝은 당신의 DBMS가에 따라 다름)이다 단일 차원.
하나의 최적화 - 여기 "공간"보다 다른 데이터 유형을 사용하는 문제는 "사각형 선택"의 네 종류의 수 (와 MySQL이 확실히 일반적으로 밝은 아닌 보통이 얼마나 밝은 당신의 DBMS가에 따라 다름)이다 단일 차원.
이 시스템은 검사 할 행 세트를 줄일 수있는 경도 지수 또는 위도 인덱스 및 사용 중 하나를 선택할 수 있습니다. 이 것을 완료 후에 그러나의 선택이있다 : (a)에 발견 된 모든 행을 페치하고 "다른 차원", 또는 이후 다음, (b)는 "다른 차원"에서 유사한 과정을 수행하고 위해 그와 테스트를 통해 스캔 그 두 개의 결과 세트 매칭하는 두 행에 나타나는 참조한다. 이 후자의 옵션은 특정 DBMS 엔진에 같은 구현되지 않을 수 있습니다.
일종의 후자의 "자동으로"수행의 공간 인덱스는, 나는 공간 인덱스는 어떤 경우에 최상의 성능을 줄 것이다라고하는 것이 안전하다고 생각 때문에,하지만 크게 다른 솔루션을 능가하지 않습니다 또한 경우 일 수 있으며, 그냥 가치가 없어 것을 귀찮게. 이 볼륨 등 실제 데이터 등의 분포 등의 작업의 모든 종류에 따라 달라집니다
플로트 (트리) 인덱스 때문에 보통은 정수에보다 수레에 '>'실행하는 데 걸리는 긴 시간의 느린 인덱스 정수보다는 필요에 의해 것을 확실히 사실이다. 이 효과는 실제로 눈에 띄는 있다면 그러나 나는 놀랄 것입니다.
-
==============================
4.구글은 "매장 위치"예에 플로트 (10,6)를 사용합니다. 내가 그와 함께 갈 수 있도록 그 충분하다.
구글은 "매장 위치"예에 플로트 (10,6)를 사용합니다. 내가 그와 함께 갈 수 있도록 그 충분하다.
https://stackoverflow.com/a/5994082/1094271
또한, MySQL의 5.6.x를 시작, 공간 확장 지원은 훨씬 더와 비교 PostGIS와에 기능과 성능입니다.
-
==============================
5.정수 (INT, 4 바이트) 1 / 1,000,000도 표현으로 나는 그것을 저장하는 것입니다. 그것은 당신에게 몇 인치의 해상도를 줄 것입니다.
정수 (INT, 4 바이트) 1 / 1,000,000도 표현으로 나는 그것을 저장하는 것입니다. 그것은 당신에게 몇 인치의 해상도를 줄 것입니다.
나는 MySQL은 어떤 고유 공간 데이터 유형이 있다고 생각하지 않습니다.
-
==============================
6.위도 또는 경도 5555.123456은 어디?
위도 또는 경도 5555.123456은 어디?
하지 마십시오 당신의 평균 플로트 (9,6) 대신?
-
==============================
7.나는 동일한 스키마 (플로트 (10,6)) 및 쿼리 (사각형 내부 선택)를하고 난 테이블에서의 MyISAM에 이노 디비에서 DB 엔진을 전환하는 것은 "사각형 룩업에있는 점"을 위해 속도를 두 배로 발견 780,000 레코드.
나는 동일한 스키마 (플로트 (10,6)) 및 쿼리 (사각형 내부 선택)를하고 난 테이블에서의 MyISAM에 이노 디비에서 DB 엔진을 전환하는 것은 "사각형 룩업에있는 점"을 위해 속도를 두 배로 발견 780,000 레코드.
또한, 나는 데카르트의 정수 (X, Y)와 X, Y에 두 개의 열 인덱스를 만들어 모든 LNG / 위도 값을 변환 내 속도는 같은 룩업 1.3 MS에 ~ 27 MS에서 갔다.
-
==============================
8.정말 당신이 데이터를 사용하는 방법에 따라 달라집니다. 그러나 사실의 총 지나친 단순화에, 소수는 빠르지 만 덜 정확한 근사치입니다. 더 많은 정보를 원하시면 여기 :
정말 당신이 데이터를 사용하는 방법에 따라 달라집니다. 그러나 사실의 총 지나친 단순화에, 소수는 빠르지 만 덜 정확한 근사치입니다. 더 많은 정보를 원하시면 여기 :
http://msdn.microsoft.com/en-us/library/aa223970(SQL.80).aspx
또한, GPS 좌표에 대한 표준은 ISO 6709에 지정되어 있습니다 :
http://en.wikipedia.org/wiki/ISO_6709
from https://stackoverflow.com/questions/1370170/database-sql-how-to-store-longitude-latitude-data by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 널 (NULL) 열 또는 별도의 테이블을 통해 키 / 값 테이블을 사용하는 [단점은 무엇입니까? (0) | 2020.07.20 |
---|---|
[SQL] 어떻게 PostgreSQL을에서 날짜 필드에 날짜를 비교? (0) | 2020.07.20 |
[SQL] 어떻게 SQL을 통해 PostgreSQL 데이터베이스에 연결된 활성 사용자를받을 수 있나요? (0) | 2020.07.20 |
[SQL] 어떻게 / 죽일 즉시 긴 SQL 쿼리를 중지? (0) | 2020.07.20 |
[SQL] 선택하고 하나의 검색어로 데이터베이스 레코드를 업데이트 (0) | 2020.07.20 |