공간 인덱스를 사용하지 않음
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.0
lng/lat 포인트로 이상한 일을 합니다.
이 쿼리가 생성하는 결과에는 한 가지 결함이 있습니다. 이 결함은 지정된 반지름 내에서뿐만 아니라 경계 상자의 모든 점을 반환합니다.그것은 별도의 거리 계산으로 해결할 수 있다.이 모든 것을 여기에 상세하게 적어두었습니다.
주의: GPS 해상도의 위도와 경도의 경우 32비트FLOAT
이치노 DOUBLE
MySQL my my my my 。단위로 .DECIMAL()
는 lat/lg 좌표에 이상적인 데이터형이 아닙니다.
언급URL : https://stackoverflow.com/questions/35093608/spatial-index-not-being-used
'IT' 카테고리의 다른 글
static const와 const의 차이점은 무엇입니까? (0) | 2022.10.28 |
---|---|
하나의 .js 파일에서 컴포넌트를 여러 파일로 분할합니다. (0) | 2022.10.28 |
C 헤더 파일을 작성하려면 어떻게 해야 합니까? (0) | 2022.10.28 |
MySQL: 필드별 주문, 끝에 빈 셀 배치 (0) | 2022.10.28 |
MariaDB가 " " 근처에 있는 구문이 잘못되었습니다. (0) | 2022.10.28 |