【问题标题】:Why doesn't this query use key(MySQL 5.7 spatial)?为什么这个查询不使用键(MySQL 5.7 空间)?
【发布时间】:2016-01-20 02:32:38
【问题描述】:

我使用的是 MySQL 5.7.10,存储引擎是 InnoDB。 以下是 SQL。
1.建表

CREATE TABLE `geo` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`geo` GEOMETRY NOT NULL,
PRIMARY KEY (`id`),
SPATIAL INDEX `geo` (`geo`)
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1

2。插入数据

insert into geo(geo) values(ST_GeomFromText('POINT(108.875000 34.216020)'));
insert into geo(geo) values(ST_GeomFromText('POINT(109.569098 36.646357)'));
insert into geo(geo) values(ST_GeomFromText('POINT(109.550988 36.633384)'));
insert into geo(geo) values(ST_GeomFromText('POINT(109.472800 36.624116)'));
insert into geo(geo) values(ST_GeomFromText('POINT(109.487460 36.563614)'));
insert into geo(geo) values(ST_GeomFromText('POINT(109.532016 36.686191)'));
insert into geo(geo) values(ST_GeomFromText('POINT(109.319010 36.987505)'));

3。创建一个多边形

SET @g3 = ST_GeomFromText('Polygon((108 36.5,108 36.7,109.5 36.7,109.5 36.5,108 36.5))');

4。解释SQL

mysql> explain select st_x(geo),st_y(geo) from geo where mbrcontains(@g3,geo)>0\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: geo
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 8
filtered: 100.00
Extra: Using where
1 row in set, 1 warning (0.00 sec)

mysql> show warnings\G
*************************** 1. row ***************************
Level: Note
Code: 1003
Message: /* select#1 */ select st_x(`map`.`geo`.`geo`) AS `st_x(geo)`,st_y(`map`.`geo`.`geo`) AS `st_y(geo)` from `map`.`geo` where (mbrcontains((@`g3`),`map`.`geo`.`geo`) > 0)
1 row in set (0.00 sec)

为什么这个查询不使用键?

【问题讨论】:

  • 您的EXPLAIN 返回了一个警告。它以前如何? (在查询后运行SHOW WARNINGS 以显示警告。)
  • mysql> show warnings\G *************************** 1. row *************************** Level: Note Code: 1003 Message: /* select#1 */ select st_x(``map.geo.geo) AS st_x(geo),st_y(map.geo.geo) AS st_y(geo) 来自@987654@987654 987654336@ where (mbrcontains((@g3),map.geo.geo) > 0) 1 行 in set (0.00 sec)`
  • 请在您的问题中包含警告,而不是在评论中。

标签: mysql geospatial spatial-query spatial-index


【解决方案1】:

基于此Percona post

"空间索引 (RTREE) 仅支持 MyISAM 表。可以使用 InnoDB 表的功能,但不会使用空间键"

【讨论】:

  • "对于 MyISAM 和(从 MySQL 5.7.5 开始)InnoDB 表,MySQL 可以使用类似于创建常规索引的语法创建空间索引,但使用 SPATIAL 关键字。"----@ 987654322@
  • 我和 MySQL 都犯了错误。我的错误是函数“mbrcontains”不能与“>”一起使用。 MySQL的错误是5.7.10不支持空间索引。当我将表的存储引擎更改为MyISAM时,查询使用了索引。所以这一定是MySQL的错误。
【解决方案2】:

起初,我想将此作为评论添加到已接受的答案中,但后来我决定添加另一个,因为已接受的答案是错误的。

InnoDB 在 5.7 中确实支持空间索引。您使用 InnoDB 的查询跳过索引的原因是由于优化器,而不是缺少存储引擎的支持。优化器只是决定在 InnoDB 的情况下使用索引不划算(无论出于何种原因)。为了确认它向表中添加更多行(最好是随机分布点)并重复查询

【讨论】:

    猜你喜欢
    • 2018-04-11
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    相关资源
    最近更新 更多