CREATE TABLE tb_geo( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(128) NOT NULL, pnt POINT NOT NULL, SPATIAL INDEX `spatIdx` (`pnt`) <!-- 1、創建表時創建空間索引 --> )ENGINE=MYISAM DEFAULT CHARSET=utf8; <!-- 數據庫表引擎設置為 MYISAM--> <!-- 2、已經存在的表上創建索引 --> <!-- ALTER TABLE tb_geo ADD SPATIAL INDEX spatIdx(pnt); --> <!-- 3、使用CREATE INDEX語句創建索引,語法如下 --> <!-- CREATE SPATIAL INDEX spatIdx ON t7(g) --> <!-- 刪除索引 --> <!-- ALTER TABLE book DROP INDEX UniqidIdx --> <!-- 表描述信息--> DESCRIBE tb_geo; <!-- 插入數據 --> INSERT 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開發團隊表示有計划支持多維。此外,開發團隊正在做更多關於性能方面的工作,以使其更加高效。