Mysql空间类型介绍:
MySQL支持空间扩展,允许生成、保存和分析地理特征。这些特征可用于MyISAM、InnoDB、NDB、BDB和ARCHIVE表(但是,ARCHIVE引擎不支持索引功能,因此,不能为ARCHIVE列中的空间列编制索引)。
测试目的:
想用mysql的专用空间类型来代替整数类型存储坐标信息,从而在地图搜索的时候提高效率。
参考文档:
http://dev.mysql.com/doc/refman/5.1/zh/spatial-extensions-in-mysql.html
测试环境:
服务器:PowerEdge R710
内存:32G
软件:percona mysql 5.5.28
测试:
一、功能测试
1. 建立空间类型的表和整形类型的表,分别保存的数据为user_id,x轴坐标,y轴坐标
CREATE TABLE `testa` (
`uid` int(11) DEFAULT NULL,
`p` point NOT NULL ,
SPATIAL KEY `p` (`p`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1COLLATE=latin1_bin
CREATE TABLE `testb` (
`uid` int(11) DEFAULT NULL,
`x` int(11) DEFAULT NULL,
`y` int(11) DEFAULT NULL,
Key `x`(`x`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1COLLATE=latin1_bin
2. 生成测试数据
awk'BEGIN{srand();for(i=1;i<=100000;i++)printn++,int(rand()*1000),int(rand()*1000)}' > a.txt
3. 将测试数据导入到空间类型与整数类型的表中
cat a.txt|awk '{print "INSERT INTOtesta VALUES ("$1",GeomFromText(\"POINT("$2""$3")\"));"}'|mysql
cat a.txt|awk '{print "INSERT INTOtestb VALUES("$1","$2","$3")\"));"}'|mysql
4. 查看数据是否插入成功
mysql> select uid,astext(p) fromtesta limit 3;
+------+----------------+
| uid |astext(p) |
+------+----------------+
| 0 | POINT(140 955) |
| 1 | POINT(912 377) |
| 2 | POINT(63561) |
+------+----------------+
mysql> select uid,x,y from testblimit 3;
+------+----------------+---+
| uid | x | y |
+------+----------------+---+
| 0 | 140 | 955|
| 1 | 912 | 377|
| 2 | 635 | 61 |
+------+----------------+---+
二、性能测试
1. 用同样的条件对空间类型的表和整形的表进行查询操作
mysql> SELECT count(uid) FROM testa WHERE Intersects(p, GeomFromText('POLYGON((0 0, 300 0, 300 300, 0 300, 0 0))') ) and uid>1000anduid<=2000;
+------------+
| count(uid) |
+------------+
| 93 |
+------------+
1 row in set (1.67 sec)
mysql> SELECT count(uid) FROM testb WHERE x>=0 andx<=300 and y>=0 and y<=300 and uid>1000 anduid<=2000;
+------------+
| count(uid) |
+------------+
| 93 |
+------------+
1 row in set (1.28 sec)
2. 性能测试结果
测试结论:
mysql的空间类型还不够成熟,用作坐标查询没有优势比用整形存储查询速度要慢,而且业界使用的也很少,所以地图搜索不能使用该类型。