学习mysql4.1的空间数据库特性(2)
PS:由于一边上班一边记录测试数据,所以可能乱糟糟的,如果有朋友看了,看见错误留个言给我,谢了。
在mysql4.1的空间数据库特性(1)里已经把几个基本的问题解决了: 如何存储空间数据。 如何读取空间数据。 需要用到哪些的mysql的空间数据特性和函数。 (要到到1 用于在各种格式间转换几何值的函数。3 描述两种几何值之间关系的函数。)
现在要处理的问题是: 问题一:原有数据如何合适地转换成新的数据格式。 问题二:空间数据比原有数据在操作方面效率到底提高多少,有无转换的必要。 解决问题时出现的其他问题: 问题三:无法在原有表基础上增加空间数据列?(跟问题一有关联) |
06年11月3日
MySQL提供了一组在空间数据上执行各种操作的函数。根据它们所执行的操作类型,可以将这些函数分为四种主要类别: · 1 用于在各种格式间转换几何值的函数。 · 2 用于访问几何值定性或定量属性的函数。 · 3 描述两种几何值之间关系的函数。 · 4 从已有Geometry创建新Geometry的函数 (来自mysql5.1的官方文档) |
问题一
1 如何把原有的大部分数据(非空间形式数据)转换成空间数据比较恰当?
对于原有的数据,有两种方式处理:
第一种可以创建一个新表然后把有来的两列longitude,latitude合并到一列中gps_point(空间数据列)中。删除原来的两列。这样做的话势必要在公司原来的接口中改动大量的代码。
另一个种方法就是在旧表添加一列gps_point(空间数据列),然后写一个小程序,把两列的经纬度数据写入这个gps_point列。
这样的好处是增加了存储空间,但不需要在原有的接口中改动大量的代码。
相对而言:空间储存的浪费似乎不是那么重要,所以第二种方法就比较合适了。
简明的操作步骤:
假设这是原有的表gps_example,里面有上百万条数据。
现在在上面加一空间数据列(在这个过程中可能出现问题3,见下面问题3)
这样的话只要写个小程序把longitude,latidtude的值写到gps_point列的话,原有的接口不需改动,新的接口可以直接使用
gps_point列的空间数据特性,真是方便!(PS:我转换了一个表,大概50万条数据,用了大概6分钟,可能在转换的方法实现上面比较粗糙,应该可以再快一点)
现在光光把数据转移成空间数据形式的话,速度就提高了?
no~
查询提高的主要原因在于在空间数据列上建立了空间索引,而我们现在的gps_example表上面还没有建立空间索引,那下面就来
建个空间索引。
这样的话,整个表结构修改成功。就可以在新表上面测试下空间数据形式带来的性能上的提高了。
优化空间分析 可以使用索引对2个非空间数据库中的搜索操作进行优化。对于空间数据库,这同样成立。有了以前设计的大量多维索引功能的帮助,能够对空间搜索进行优化。最典型的情况如下: · 搜索包含给定点的所有对象的Point查询。 · 搜索与给定地区交迭的所有对象的地区查询。 MySQL采用了具有2次分裂特性的R-Trees来为空间列编制索引。使用几何对象的MBR来创建空间索引。对于大多数几何对象,MBR是包围几何对象的最小矩形。对于水平或垂直linestring,MBR退化为linestring的矩形。对于点,MBR是退化为点的矩形。 此外,还能在空间列上创建正常索引。需要为除POINT列之外的空间列上的任何索引(非空间)声明前缀。 (来自mysql5.1的官方文档) (PS:在mysql5.1的官方文档中[第19章:MySQL中的空间扩展]中有详细的说明使用和不使用空间索引进行查询的结果,有兴趣的话可以直接看下官方文档。)
|
问题二
空间数据比原有数据在操作方面效率到底提高多少?有转换的必要吗?
当500000多万条数据为查count()函数记录22886时候空间数据查询跟比空间形式查询的快了3秒。
当500000多万条数据count()函数求出4条记录时候空间数据查询跟非空间形式查询的差别!
PS:速度啊!体现出来了!
PS:不过后来发现上面的对抗是不公平对抗,非空间数据的表我没有给longitude,latitude建索引,
不然速度其实也差不了多少~~~~
但转换成空间数据形式
至少还有这么下面这么多函数可以用:)也
· MBRContains(g1,g2)
返回1或0以指明g1的最小边界矩形是否包含g2的最小边界矩形。
mysql> SET @g1 = GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');
mysql> SET @g2 = GeomFromText('Point(1 1)');
mysql> SELECT MBRContains(@g1,@g2), MBRContains(@g2,@g1);
----------------------+----------------------+
| MBRContains(@g1,@g2) | MBRContains(@g2,@g1) |
+----------------------+----------------------+
| 1 | 0 |
+----------------------+----------------------+
· MBRDisjoint(g1,g2)
返回1或0以指明两个几何变量g1和g2的最小边界矩形是否不相交。
· MBREqual(g1,g2)
返回1或0以指明两个几何变量g1和g2的最小边界矩形是否相同。
· MBRIntersects(g1,g2)
返回1或0以指明两个几何变量g1和g2的最小边界矩形是否相交。
· MBROverlaps(g1,g2)
返回1或0以指明两个几何变量g1和g2的最小边界矩形是否交迭。
· MBRTouches(g1,g2)
返回1或0以指明两个几何变量g1和g2的最小边界矩形是否接触。
· MBRWithin(g1,g2)
返回1或0以指明g1的最小边界矩形是否位于g2的最小边界矩形内。
问题三
无法使用空间增加空间数据列?
问题如下:
解决办法:
当MySQL被用MySQL配置向导安装在Windows平台上,InnoDB存储引擎替代MyISAM存储引擎作为替代,请参阅2.3.5.1节,“介绍”。
要把一个表从一个类型转到另一个类型,可使用ALTER TABLE语句,这个语句指明新的类型:
ALTER TABLE t ENGINE = MYISAM;
ALTER TABLE t TYPE = BDB;