Mysql 空间索引未用于边界框搜索中的多边形
我在MariaDB中有一个MyISAM表,其中包含两个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
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);