mysql - 为什么这个查询不使用键(MySQL 5.7 空间)?

标签 mysql geospatial spatial-query spatial-index

我使用的是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)

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

最佳答案

基于此Percona post

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

关于mysql - 为什么这个查询不使用键(MySQL 5.7 空间)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34890539/

相关文章:

java - Android sqlite语法错误: near ")"

phpMyAdmin 通过 http 登录

mysql - 将坐标插入 MySQL - PolyFromText SQL 语法错误/返回空值

python - 将 GeoTIFF 转换为 JPEG 并在 Python 中提取 GeoTIFF header

c# - 缓冲折线以创建多边形的有效算法?

java - 当我在字段类型中添加 "spatialContextFactory"属性时,Solr Core 未加载

mysql - 如何使用env_file在docker-compose中隐藏Mysql密码

mysql - 使用 Node.js 从 MySQL 中提取数据并显示在 HTML 页面上

java - 什么是在Java中存储和搜索二维空间坐标的好数据结构

hibernate 空间 : can't find function