2011-01-18 4 views
1

먼저 캐싱에 신참이라고 말하고 싶습니다. 따라서 내 질문에 어리 석다면 모든 설명을 정교하게하고 부담하십시오.평범하지 않은 Geolocation 쿼리 db 캐싱

저는 리소스가 매우 제한된 서버가 있으므로 가능한 한 효과적으로 db- 쿼리를 캐싱하는 데 관심이 있습니다. 내 문제는 이것입니다 :

geolocations에 대한 테이블이있는 MYSQL DB가 있습니다. 위도와 위도 (lat와 lng) 열이 있습니다. 위도는 lat와 lng가 항상 같고 색인은 1 개뿐입니다. 내 이해에 효과적으로 사용됨 (?).

쿼리가 매우

select lat, lng 
where lat BETWEEN 123123123 AND 312412312 AND lng BETWEEN 235124231 AND 34123124 

같은 좌표로 교류되는 곳 끊임없이 변화하는 BETWEEN 쿼리의 경계에있는 긴 숫자, 그래서이 스마트 방식을 캐시 할 수있는 방법은, 그래서 거기 캐시가 완전한 쿼리 일치 일 필요는 없지만 이전 쿼리 간의 값을 일부 db 리소스를 절약하기 위해 새 값에 대해 유지할 수 있습니까?

내 질문에 답변 해 주시면 감사하겠습니다. 부탁드립니다.

는 너무 감사

업데이트 이제 내가 쿼리의 가장 효율적인 방법이 될 것입니다 무엇을 알고 싶은 몇 가지 반응을 얻었으니 24/01/2011

. INT 값으로 쿼리 실행 사이

  1. 는 빠르게 또는
  2. 포인트 값으로 반경 계산은 어떻게 최적의 인덱스의 모습

1. 경우 빠른 실행 할 것인가?

+0

@Carl Manaster, @Quassnoi 위도/경도 열에 가장 적합한 데이터 형식은 무엇이라고 생각하십니까? 무슨 뜻 빠른 내가 위도 또는 POINT 계산에 대한 인덱스와 함께 BETWEEN 검색 어디 쿼리가 될 것인가? – Jakob

+0

@Car Manaster, @Quassnoi 가장 효율적인 int indexing 또는 point calculation에 대한 귀하의 의견을 진심으로 감사드립니다. – Jakob

답변

2

테이블은 당신이 기꺼이하지 않거나 공간 인덱스, 당신이해야 두 개의 인덱스를 사용할 수없는 경우 Point 데이터 타입 (자세한 내용은 this answer 참조)

를 사용할 수 MyISAM 경우 :

CREATE INDEX ix_mytable_lat_lon ON mytable (lat, lon) 
CREATE INDEX ix_mytable_lon_lat ON mytable (lon, lat) 

이 경우 MySQL은 이러한 인덱스를 통해 index_intersect을 사용할 수 있습니다.이 인덱스는 단순한 단일 인덱스 필터링보다 빠릅니다.

두 개가 있으면 선택적인 색인을 선택할 수 있습니다.

캐싱의 경우 색인에서 읽은 모든 페이지가 캐시되고 더 높은 데이터로 덮어 쓰기 될 때까지 메모리에 상주합니다 (모든 데이터베이스가 캐시에 맞지는 않음).

이렇게하면 MySQL에서 디스크의 데이터를 읽을 필요가 없습니다.

MySQL도 전체 결과 집합을 메모리에 캐시 할 수 있지만 모든 매개 변수가 동일하게 반복적으로 쿼리를 반복해야합니다.

+0

우수한 답변입니다! 실제로 공간 인덱스가 존재한다는 것을 알지 못해서 알려 주셔서 감사합니다. 지금은 맵의 경계를 얻고 "사이"를 호출하여 맵의 시각적 범위 내에서 마커를 가져옵니다. 이것은 공간보다 덜 효율적입니까? 반지름이 일종의 원 계산을 필요로하는 것 같아요. 그리고 나는 DB에 너무 많은 하중을 가하지 않는 것을 정말 좋아합니다. db에 최소한의 부담을 줄 수있는 방법에 대한 평결은 무엇입니까? – Jakob

+0

@Jakob :'BETWEEN'은'lat' 또는'lon'을 필터링하기 위해 인덱스 만 사용할 수 있습니다. 둘 다 사용할 수는 없습니다. 당신의 쿼리가 정사각형 내에 있지만 그 incircle에서 객체를 반환하는 것이 'OK'라면, 당신은 단지 한 쌍의 베틀을 사용할 수 있습니다. 서클 계산은 부피가 커 보이지만 실제로는 현대 프로세서에서는 어렵지 않습니다. 여분의 데이터를 읽고 전송하는 것은 한 쌍의 부동 소수점 명령어보다 많은 오버 헤드를 의미 할 수 있습니다. – Quassnoi

+0

지도가 정사각형이며 점은 등급에 따라 필터링되며 mapCenter에 얼마나 가깝지는 않습니다. 따라서 Square는 기능적으로 괜찮습니다. 대개 서버 부하와 속도에 대한 고려가 필요합니다. 내가 설명해 준 색인에 대해 자세히 설명 할 수 있을까요? 왜 두 가지가 필요한지 주위에서 머리를 터지게 할 수는 없지만 조합 된 주문에 대해서는 얻지 못할 것입니다. – Jakob

2

데이터를 더 잘 특성화해야 할 필요가 있다고 생각합니다.상관 관계가없는 위도와 경도에 균등하게 분산 된 데이터가 있고 검색어가 유사하게 분산되어 있고 독립적 인 경우에는 문제가 발생합니다. 그러나 데이터 또는 쿼리가 흥미로운 방식으로 클러스터링되는 경우 적어도 일부 쿼리를 더 빠르게 만드는 새로운 열을 도입 할 수 있습니다. 대부분의 쿼리가 일부 어려운 범위 내에서 발생하는 경우 해당 데이터를 따로 설정할 수 있습니다. 플래그를 추가하거나 다른 테이블에 연결하거나 빈번하게 요청 된 데이터를 자체 테이블에 넣을 수도 있습니다. 데이터에 대해 더 이상 알려 줄 수 있습니까?

+0

참여해 주셔서 감사 드리며, 저는이 생각들을 정말로 듣고 싶습니다. 불행히도 마커는 전 세계에 걸쳐 거의 산재 해 있으며 쿼리가 매우 다릅니다. 귀하의 답변에서 취한 이후 인덱싱에 대해 좀 더 살펴보아야합니다. 큐어가 최적화되고 데이터 구조가 최상의 상태로 형성되면 캐싱이 실제로 중요한 문제일까요? – Jakob

+0

@Jakob, 쿼리가 매우 다른 경우 캐싱을 사용하면 크게 도움이 될 것 같지 않습니다. 이 상황에서 캐시에있는 데이터의 가능성은 적기 때문에 캐시 된 데이터의 성능 이점이 매우 높더라도 해당 이점을 얻을 확률은 매우 낮습니다. 죄송합니다! –

+0

입력 해 주셔서 감사합니다. 때로는 옳은 대답은 "다른 질문하기"이며, 그 중 하나처럼 보입니다. 이 점을 지적 해 주셔서 감사합니다. – Jakob

관련 문제