2013-02-10 2 views
0

모두3D 거리 계산을위한 어떤 데이터베이스입니까?

나는 결국 내 솔루션 중 하나에 대한 MySQL을 성장했습니다. 지금은 3D 공간에 객체의 x, y, z를 저장하는 7 천만 개의 행이 있습니다. 불행히도 삽입/쿼리를 더 이상 처리하기 위해 데이터베이스를 최적화하는 방법을 알지 못합니다. 거리를 기반으로 쿼리해야합니다 (거리 내에있는 객체 가져 오기).

누구에게 좋은 대체 방법에 대한 제안이 있습니까? 비슷한 문제가 발생할 수 있으므로 hbase 또는 비 관계형 데이터베이스와 같은 것을보고 있어야하는지 여부는 알 수 없습니다. 나는 일반적으로 분당 약 100 행을 삽입, 내 쿼리는 다음과 같습니다

// get objects within 500 yards 
SELECT DISTINCT `object_positions`.`entry` FROM `object_positions` WHERE `object_positions`.`type` = 3 AND `object_positions`.`continent` = '$p->continent' AND SQRT(POW((`object_positions`.`x` - $p->x), 2) + POW((`object_positions`.`y` - $p->y), 2) + POW((`object_positions`.`z` - $p->z), 2)) < 500; 

아무것도 복잡 미친,하지만 난 관련된 수학은 MySQL이 폭발의 원인이 무엇이라고 생각하고 내가보고해야하는지 궁금하네요 클라우드 기반 데이터베이스 솔루션? 초당 10-100 개의 쿼리를 처리 할 수 ​​있습니다.

+0

'object_positions' 테이블에'continent' 필드가 포함되어 있다면, 지리적 위치를 저장하려고하는 것처럼 들리 겠지요. 그렇다면이 질문에 대한 답을 찾아보십시오. http://stackoverflow.com/ 질문/1006654/가장 빠른 길 - 찾을 - 거리 - 두 - 위도 - 긴 - 포인트 사이 –

+0

나는 x, y, z를 가지고 있기 때문에 SPATIAL을 사용할 수 없습니다. 경도/위도가 아닙니다 : ( – Geesu

+0

지상 또는 해발에서 위/아래 높이를 저장해야합니까? –

답변

3

문제가되는 것이 MySQL이 아니기 때문에 문제에 대한 인덱싱을 적용해야합니다. NoSQL 또는 클라우드 컴퓨팅이 마법으로 해결할 문제가 없습니다.

여기에는 명확성을 위해 약간 단순화 된 검색어가 나와 있습니다.

SELECT DISTINCT entry 
      FROM object_positions 
      WHERE type = 3 
      AND continent = '$p->continent' 
      AND DIST(x,$p->x, y, $p->y, z,$p-z) < 500 

DIST()는 당신의 직교 거리 함수에 대한 속기입니다. 인덱스가 사용할 수 있도록 할 WHERE

SELECT DISTINCT entry 
      FROM object_positions 
      WHERE type = 3 
      AND continent = '$p->continent' 
      AND x BETWEEN ($p->x - 500) AND ($p->x + 500) 
      AND y BETWEEN ($p->y - 500) AND ($p->y + 500) 
      AND z BETWEEN ($p->z - 500) AND ($p->z + 500) 
      AND DIST(x,$p->x, y, $p->y, z,$p-z) < 500 

BETWEEN 조항 :

당신은 당신이 할 필요가, 테이블의 x, y, z에 별도의 인덱스를 둘 필요가 각 쿼리에 대해 테이블의 전체 테이블 검색을 피하십시오. 후보 지점을 둘러싸고있는 1000x1000x1000 큐브의 모든 지점을 선택합니다. 그러면 DIST 계산은 원하는 반경 밖에있는 것을 버려 낼 것입니다. 동일한 배치를 얻지 만 훨씬 더 효율적입니다.

실제로 DIST 기능을 만들 필요는 없습니다. 당신의 질문에 당신이 가지고있는 수식은 괜찮습니다.

(유형, 대륙)에 대한 색인이 있습니다. 그렇습니까? 그렇지 않다면 당신도 필요합니다.

+0

더 빠른 계산을 위해 xyz를 ints로 바꿔야합니까? 아니면 float ok로 남겨 두어야합니까? 실제로 플로트로 원시 xyz를 저장하지만 x_int, y_int 및 z_int 만 쿼리하면됩니다. float 연산보다 빠름 – Geesu

+0

x, y 및 z에 대해 'FLOAT' 또는'INT '를 사용하더라도 성능에는 아무런 차이가 없으며 서로 같은 공간을 사용하며 둘 중 하나를 인덱싱 할 수 있습니다. 너는 오 생각 했어. 따라서 'FLOAT' 데이터 유형에서 사용 가능한 정밀도는 애플리케이션에 충분합니다. 내가 무슨 말을하는지 잘 모르겠다면 http : // dev.mysql.com/doc/refman/5.0/en/problems-with-float.html 만약 내가 너라면 float과 int를 섞어 버릴 것이다. –

관련 문제