Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 空间索引未用于边界框搜索中的多边形_Mysql_Sql_Mariadb_Myisam_Spatial Index - Fatal编程技术网

Mysql 空间索引未用于边界框搜索中的多边形

Mysql 空间索引未用于边界框搜索中的多边形,mysql,sql,mariadb,myisam,spatial-index,Mysql,Sql,Mariadb,Myisam,Spatial Index,我在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

我在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
用数据填充表格后,我再添加一个
多边形
列:

ALTER TABLE mytable add time_range_int POLYGON NULL;
然后用从
开始
结束
创建的多边形填充列:

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)
    )
  );
然后,我将列设置为
notnull
,并在其上创建一个空间索引:

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";
(感谢O.Jones关于参数顺序的提示) 但是,没有使用空间索引,两个版本的查询都需要相同的执行时间。即使第二页的
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 |
+------+---------------+---------+--------+------------------+------------------+-----------+--------+--------+-------------+
+------+---------------+---------+--------+------------------+------------------+-----------+--------+--------+-------------+
|id |选择|类型|类型|可能的|键|键|列|参考|行|额外|
|------+---------------+---------+--------+------------------+------------------+-----------+--------+--------+-------------|
|1 |简单|我的表格|范围|索引|时间|范围|索引|时间|范围| 34 | 67505 |使用where|
+------+---------------+---------+--------+------------------+------------------+-----------+--------+--------+-------------+
当我使用
ignoreindex(INDEX\u time\u range)


这是MariaDB中的一个bug吗?我的版本是
10.1.21-MariaDB
还是缺少什么?

尝试将参数顺序切换为
mbracontains()
类似的内容

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坐标,并以这种方式使用了空间搜索。

谢谢,这已经改变了
EXPLAIN
的结果,将
index\u time\u range
作为索引,但是,性能根本没有受到影响,我将编辑问题,将您的建议包括在查询缓存中,也许,混淆你的测试?执行
选择NO\u QUERY\u缓存从mytable开始,从mytable结束…
阅读此内容。此外,我想知道数据集中y维度的高度重叠是否会在某种程度上扰乱空间索引搜索?事实上,正如您所建议的,我确实在使用
SQL\u NO\u CACHE
,并且已经对问题进行了编辑,将其包括在内。关于第二部分,我想我不太明白,你能详细说明一下吗?
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);