programing

폴리곤 내 경계 상자 검색에 공간 인덱스가 사용되지 않음

magicmemo 2023. 8. 4. 23:00
반응형

폴리곤 내 경계 상자 검색에 공간 인덱스가 사용되지 않음

MariaDB의 MyISAM 테이블에 두 개가 있습니다.datetimebegin그리고.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

반응형