2016-01-20 8 views
0

Я использую MySQL 5.7.10, механизм хранения - InnoDB. Ниже приведены SQL.
1. создать таблицуПочему этот запрос не использует ключ (MySQL 5.7)?

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) 

Почему Безразлично» t thi s ключ использования запроса?

+0

Вашего 'EXPLAIN' вернулся предупреждение. Что это было? (Запустите 'SHOW WARNINGS' после запроса, чтобы отобразить предупреждение.) – duskwuff

+0

' mysql> показать предупреждения \ G ************************** * 1. строка *************************** Уровень: Примечание Код: 1003 Сообщение:/* выберите # 1 */select st_x ('' map'.'geo'''geo') AS 'st_x (geo)', st_y ('map'.'geo''geo') AS' st_y (geo) 'fro m' map' .'geo' где (mbrcontains ((@ 'g3'),' map'.'geo''geo')> 0) 1 строка в наборе (0,00 сек) ' – user2400825

+0

Пожалуйста, включите предупреждения в свой вопрос, а не в комментарии. – duskwuff

ответ

1

На основании этого Percona post

«пространственные индексы (RTREE) поддерживается только для таблиц MyISAM. Можно использовать функции для таблиц InnoDB, но он не будет использовать пространственные ключи»

+0

«Для MyISAM и (с MySQL 5.7.5) таблиц InnoDB MySQL может создавать пространственные индексы, используя синтаксис, аналогичный тому, который создается для создания регулярных индексов, но с использованием ключевого слова SPATIAL». ---- https: //dev.mysql. com/doc/refman/5.7/en/create-spaces-indexes.html – user2400825

+0

И я, и MySQL ошибались. Моя ошибка в том, что функция «mbrcontains» conld не используется с «>». Ошибка MySQL заключается в том, что 5.7.10 не может поддерживать пространственный индекс. Когда я меняю механизм хранения таблиц в MyISAM, запрос используется индексом. Так что это ошибка MySQL. – user2400825