IT

공간 인덱스를 사용하지 않음

itgroup 2022. 10. 28. 20:42
반응형

공간 인덱스를 사용하지 않음

GEO_LOCATION 열에 공간 인덱스가 있지만 EXPRIDE를 사용해도 인덱스가 사용되지 않습니다.이유를 알 수 있는 사람?

EXPLAIN 
SELECT AsText(GEO_LOCATION) 
FROM PERSON 
WHERE ST_Distance(POINT(-94.0724223,38.0234332), GEO_LOCATION) <= 10

id: 1
유형 선택: SIMPLE
표: 개인
유형: ALL
possible_keys: NULL
키: NULL(특수)
key_len: NULL
참조: 특수한 순서
행: 612602
추가: 사용처

내 환경은 다음과 같습니다.
서버 유형:마리아DB
서버 버전: 10.1.8-MariaDB - mariadb.org 바이너리 배포
프로토콜 버전: 10
서버 문자 집합: UTF-8 Unicode (utf8)
Apache/2.4.17(Win32) OpenSSL/1.0.2d PHP/5.6.14
데이터베이스 클라이언트 버전: libmysql - mysqlnd 5.0.11-dev - 20120503
PHP 확장: mysqli 문서
PHP 버전: 5.6.14

안타깝게도 수색 기준은 아닙니다.이 쿼리를 만족시키려면 MySQL은 테이블의 모든 행에 대한 함수 값을 계산한 다음 임계값과 비교해야 합니다.따라서 전체 테이블 스캔(또는 전체 인덱스 스캔)을 수행해야 합니다.

인덱스를 이용하여 이 쿼리 속도를 높이려면 경계 상자 기준이 필요합니다.질의는 훨씬 더 정교하지만 훨씬 더 빠릅니다.지오메트리의 x/y 점이 위도/경도를 도 단위로 나타낸다고 가정하면 해당 쿼리는 다음과 같습니다.

   set @latpoint = 38.0234332;
   set @lngpoint = -94.0724223;
   set @r = 10.0;    /* ten mile radius */
   set @units=69.0;    /* 69 statute miles per degree */
   SELECT AsText(geo) 
     FROM markers
      WHERE MbrContains(GeomFromText( 
       CONCAT('LINESTRING(', @latpoint-(@r/@units),' ',
                             @lngpoint-(@r /(@units* COS(RADIANS(@latpoint)))), 
                          ',', 
                             @latpoint+(@r/@units) ,' ', 
                             @lngpoint+(@r /(@units * COS(RADIANS(@latpoint)))),
                           ')')),
                    geo) 

이게 어떻게 작동하나요?우선 Mbr Contains(bound, item) 함수sargable입니다.다른 예로, 크고 못생긴 콘센트 항목은 경계 직사각형의 남서쪽에서 북동쪽 모서리로 대각선을 만듭니다.데이터 포인트와 반경 10마일을 사용하면 다음과 같습니다.

LINESTRING(37.8785 -94.2564,38.1684 -93.8884)

를 사용하는 경우GeomFromText()첫 번째 인수로 대각선 그리기MbrContains()경계 직사각형 역할을 합니다. MbrContains()그러면 니프티 쿼드트리 지오메트리 인덱스를 이용할 수 있습니다.

세 번째,ST_Distance()MySQL에서는 위도 및 경도 계산을 처리하지 않습니다.(Postgre)SQL에는 보다 포괄적인 GIS 확장 기능이 있습니다.)MySQL은 평지에 있는 플랩잭처럼 멍청합니다.기하학적 객체의 점이 평면 기하학으로 표현된다고 가정합니다.그렇게ST_Distance() < 10.0lng/lat 포인트로 이상한 일을 합니다.

이 쿼리가 생성하는 결과에는 한 가지 결함이 있습니다. 이 결함은 지정된 반지름 내에서뿐만 아니라 경계 상자의 모든 점을 반환합니다.그것은 별도의 거리 계산으로 해결할 수 있다.이 모든 것을 여기에 상세하게 적어두었습니다.

주의: GPS 해상도의 위도와 경도의 경우 32비트FLOAT이치노 DOUBLEMySQL my my my my 。단위로 .DECIMAL()는 lat/lg 좌표에 이상적인 데이터형이 아닙니다.

언급URL : https://stackoverflow.com/questions/35093608/spatial-index-not-being-used

반응형