MySQL数据类型 - 空间数据类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL数据类型 - 空间数据类型 相关的知识,希望对你有一定的参考价值。

获取空间数据

存储在表中的几何值可以用内部格式获取,也可以将其转换为WKT或WKB格式。

●获取内部格式的空间数据:

在表到表传输中,使用内部格式获取几何值非常有用:
技术图片

●获取WKT格式的空间数据:

ST_AsText()函数的作用是:将几何图形从内部格式转换为WKT字符串。

技术图片

●获取WKB格式的空间数据:

ST_AsBinary()函数的作用是:将几何图形从内部格式转换为包含WKB值的BLOB。

技术图片
优化空间分析

对于MyISAM和InnoDB表,可以使用SPATIAL索引优化包含空间数据的列的搜索操作。最典型的操作是:

●搜索包含给定点的所有对象的点查询

●搜索与给定区域重叠的所有对象的区域查询

mysql对空间列上的SPATIAL索引使用具有二次分割的R树。使用几何体的最小边界矩形(MBR)构建SPATIAL索引。对于大多数几何体,MBR是包围几何体的最小矩形。对于水平或垂直的linestring,MBR是一个退化为linestring的矩形。对于一个点,MBR是一个退化为该点的矩形。

也可以在空间列上创建普通索引。在非SPATIAL索引中,必须为除POINT列之外的任何空间列声明一个前缀。

MyISAM和InnoDB同时支持SPATIAL索引和非SPATIAL索引。其他存储引擎支持非SPATIAL索引。

创建空间索引

对于InnoDB和MyISAM表,MySQL可以使用类似于创建常规索引的语法创建空间索引,但是使用SPATIAL关键字。空间索引中的列必须声明为NOT NULL。以下示例演示如何创建空间索引:

●使用 CREATE TABLE:
技术图片

●使用 ALTER TABLE:

技术图片

●使用 CREATE INDEX:

技术图片

SPATIAL INDEX创建R树索引。对于支持空间列的非空间索引的存储引擎,引擎将创建B树索引。空间值上的B树索引对于精确的值查找非常有用,但对于范围扫描则没用。

优化器可以使用有SRID约束的列上定义的空间索引。

要删除空间索引,请使用ALTER TABLE或DROP INDEX:

●使用 ALTER TABLE:
技术图片

●使用 DROP INDEX:
技术图片

示例:假设一个表geom包含32000多个几何图形,这些几何图形存储在GEOMETRY类型的g列中。该表还有一个AUTO_INCREMENT列fid,用于存储对象ID值。

技术图片

要在g列上添加空间索引,请使用以下语句:

技术图片

使用空间索引

对于WHERE子句使用MBRContains() 或者 MBRWithin()等函数的查询,优化器将调查是否可以在搜索中使用可用的空间索引。以下查询将查找给定矩形中的所有对象:
技术图片

使用EXPLAIN检查此查询的执行方式:

技术图片

检查没有空间索引会发生什么:
技术图片

不使用空间索引执行SELECT语句会产生相同的结果,但会导致执行时间从0.00秒增加到0.46秒:

技术图片

官方文档地址:
https://dev.mysql.com/doc/refman/8.0/en/fetching-spatial-data.html

以上是关于MySQL数据类型 - 空间数据类型 的主要内容,如果未能解决你的问题,请参考以下文章

MySQL数据类型 - 空间数据类型

MySQL数据类型 - 空间数据类型

MySQL数据类型 - 空间数据类型

MySQL数据类型 - 空间数据类型

MySQL数据类型 - 空间数据类型

MySQL日期数据类型时间类型使用总结