首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个查询不使用键(MySQL 5.7空间)?

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

Stack Overflow用户
提问于 2016-01-20 02:32:38
回答 2查看 1.1K关注 0票数 0

我使用的是MySQL 5.7.10,存储引擎是InnoDB。下面是SQL。

  1. 创建表
代码语言:javascript
复制
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
  1. 插入数据
代码语言:javascript
复制
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)'));
  1. 创建多边形
代码语言:javascript
复制
SET @g3 = ST_GeomFromText('Polygon((108 36.5,108 36.7,109.5 36.7,109.5 36.5,108 36.5))');
  1. 解释SQL
代码语言:javascript
复制
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)

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-20 03:26:49

基于这个珀科纳员额

空间索引只支持MyISAM表。可以对InnoDB表使用函数,但不使用空间键

票数 3
EN

Stack Overflow用户

发布于 2019-06-03 08:59:18

一开始,我想把它作为一个评论添加到已接受的答案中,但后来我决定添加另一个,因为接受的答案是错误的。

InnoDB在5.7中确实支持空间索引。使用InnoDB查询跳过索引的原因是优化器,而不是存储引擎中缺乏支持。优化器简单地决定,在InnoDB的情况下,使用索引是不符合成本效益的(无论出于什么原因)。要确认它,请向表中添加更多行(最好是带有随机分布点的行),并重复查询。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34890539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档