MySQL索引之空间索引(SPATIAL)
mysql对GIS空间数据的支持,包括创建空间索引
CREATE TABLE tb_geo( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(128) NOT NULL, pnt POINT NOT NULL, SPATIAL INDEX `spatIdx` (`pnt`) )ENGINE=MYISAM DEFAULT CHARSET=utf8; DESCRIBE tb_geo; NSERT INTO `tb_geo` VALUES( NULL, 'a test string', POINTFROMTEXT('POINT(15 20)')); SELECT id,NAME,ASTEXT(pnt) FROM tb_geo; SELECT id,NAME,X(pnt),Y(pnt) FROM tb_geo; SELECT ASTEXT(pnt) FROM tb_geo WHERE MBRWITHIN(pnt,GEOMFROMTEXT('Polygon((0 0,0 30,30 30,30 0,0 0))')); DROP TABLE tb_geo; SET @g1 = GEOMFROMTEXT('Polygon((0 0,0 3,3 3,3 0,0 0))'); SET @g2 = GEOMFROMTEXT('Point(1 1)'); SELECT MBRCONTAINS(@g1,@g2), MBRCONTAINS(@g2,@g1), MBRCONTAINS(@g1,@g1); SELECT MBRWITHIN(@g2,@g1),MBRWITHIN(@g1,@g2); SELECT MBRDISJOINT(@g1,@g2); SELECT MBREQUAL(@g1,@g2); SELECT MBRINTERSECTS(@g1,@g2); SELECT MBROVERLAPS(@g1,@g2); SELECT MBRTOUCHES(@g1,@g2); |
注:
在最新发布的MySQL 5.7.4实验室版本中,InnoDB存储引擎新增了对于几何数据空间索引的支持。
在此之前,InnoDB将几何数据存储为BLOB(二进制大对象)数据,在空间数据上只能创建前缀索引,当涉及空间搜索时非常低效,尤其是在涉及复杂的几何数据时。在大多数情况下,获得结果的唯一方式是扫描表。
新版本MySQL中,InnoDB支持空间索引,通过R树来实现,使得空间搜索变得高效。
InnoDB空间索引也支持MyISAM引擎现有的空间索引的语法,此外,InnoDB空间索引支持完整的事务特性以及隔离级别。
目前,InnoDB空间索引只支持两个维度的数据,MySQL开发团队表示有计划支持多维。此外,开发团队正在做更多关于性能方面的工作,以使其更加高效。