폴리곤 내 경계 상자 검색에 공간 인덱스가 사용되지 않음
MariaDB의 MyISAM 테이블에 두 개가 있습니다.datetime
열begin
그리고.end
그리고 여기 블로그 게시물과 유사한 방식으로 둘에 대한 공간 인덱스를 만들고 사용하고 싶습니다.
테이블을 만드는 방법은 다음과 같습니다.
CREATE TABLE `mytable` (
`id` int(11) NOT NULL,
`begin` datetime NOT NULL,
`end` datetime NOT NULL,
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4
테이블을 데이터로 채운 후, 저는 다음을 추가합니다.polygon
열:
ALTER TABLE mytable add time_range_int POLYGON NULL;
그런 다음 열을 다음에서 생성된 다각형으로 채웁니다.begin
그리고.end
:
UPDATE mytable
SET time_range_int=Polygon(
LineString(
Point(UNIX_TIMESTAMP(begin), 1),
Point(UNIX_TIMESTAMP(begin), 0),
Point(UNIX_TIMESTAMP(end), 0),
Point(UNIX_TIMESTAMP(end), 1),
Point(UNIX_TIMESTAMP(begin), 1)
)
);
그런 다음 열을 다음으로 설정합니다.NOT NULL
공간 인덱스를 생성합니다.
ALTER TABLE mytable MODIFY time_range_int POLYGON NOT NULL;
CREATE SPATIAL INDEX index_time_range on mytable(time_range_int);
그런 다음 테이블에 시간 간격이 포함된 행을 쿼리하려고 합니다.2016-12-19
그리고.2016-12-20
제가 보통 하는 일은 공간 색인 없이 다음과 같습니다.
SELECT SQL_NO_CACHE begin, end from mytable WHERE begin<="2016-12-19" and end>="2016-12-20";
대신 다음을 사용하여 새로 작성된 공간 인덱스를 활용하려고 합니다.
SELECT SQL_NO_CACHE begin, end FROM mytable
WHERE MBRWithin(
Polygon(
LineString(
Point(UNIX_TIMESTAMP("2016-12-19 00:00:00"), 1),
Point(UNIX_TIMESTAMP("2016-12-19 00:00:00"), 0),
Point(UNIX_TIMESTAMP("2016-12-20 00:00:00"), 0),
Point(UNIX_TIMESTAMP("2016-12-20 00:00:00"), 1),
Point(UNIX_TIMESTAMP("2016-12-19 00:00:00"), 1)
)
),
time_range_int,
);
(고마워 O.Jones for hint to parameter order) 그러나 공간 인덱스가 사용되지 않고 있으며 두 버전의 쿼리 모두 동일한 실행 시간이 필요합니다.그럼에도 불구하고.Explain
두 번째는 쿼리가 인덱스를 사용하고 있음을 나타냅니다.
+------+---------------+---------+--------+------------------+------------------+-----------+--------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
|------+---------------+---------+--------+------------------+------------------+-----------+--------+--------+-------------|
| 1 | SIMPLE | mytable | range | index_time_range | index_time_range | 34 | <null> | 67505 | Using where |
+------+---------------+---------+--------+------------------+------------------+-----------+--------+--------+-------------+
그리고 두 번째 쿼리를 실행해도 속도 차이가 없습니다.IGNORE INDEX(index_time_range)
이것은 MariaDB의 버그입니까?내 버전은10.1.21-MariaDB
아니면 제가 뭔가를 놓치고 있나요?
매개 변수의 순서를 다음으로 전환해 보십시오.MBRContains()
이런 거.
SELECT begin, end FROM mytable
WHERE MBRContains(
Polygon(
LineString(
Point(UNIX_TIMESTAMP("2016-12-19 00:00:00"), 1),
Point(UNIX_TIMESTAMP("2016-12-19 00:00:00"), 0),
Point(UNIX_TIMESTAMP("2016-12-20 00:00:00"), 0),
Point(UNIX_TIMESTAMP("2016-12-20 00:00:00"), 1),
Point(UNIX_TIMESTAMP("2016-12-19 00:00:00"), 1)
)
),
time_range_int);
저는 실제 x 좌표와 y 좌표를 사용하여 공간 검색을 성공적으로 수행했습니다.
언급URL : https://stackoverflow.com/questions/43757499/spatial-index-not-being-used-for-polygon-in-bounding-box-search
'programing' 카테고리의 다른 글
PHP MYSQL 중첩된 json으로 OneToMany 선택 (0) | 2023.08.09 |
---|---|
CSS 선택기/HTML 속성에 대시가 선호되는 이유는 무엇입니까? (0) | 2023.08.04 |
상대 레이아웃에서 보기를 프로그래밍 방식으로 레이아웃하는 방법은 무엇입니까? (0) | 2023.08.04 |
IntelliJ Idea에서 스프링 부트 응용 프로그램을 시작할 수 없습니다. (0) | 2023.08.04 |
Oracle에서 Azure DB의 텍스트 필드로 clob 필드를 내보내는 중 오류 발생 (0) | 2023.08.04 |