Com*_*Vie 20 mysql performance spatial
我想在我的 MySQL 数据库中存储一些几何位置。为此,我使用 POINT 数据类型。我读到的几乎所有地方都GeomFromText应该使用该函数在表中插入数据。
但是,我发现这POINT(X,Y)也有效。我没有找到任何说明为什么GeomFromText应该使用POINT.
例如,我有以下简单的关系:
CREATE TABLE Site (
SiteID BIGINT UNSIGNED,
Position POINT
);
Run Code Online (Sandbox Code Playgroud)
我可以使用以下两种变体插入值:
INSERT INTO Site (
1,
GeomFromText( 'POINT(48.19976 16.45572)' )
);
INSERT INTO Site (
2,
POINT(48.19976, 16.45572)
);
Run Code Online (Sandbox Code Playgroud)
当我查看表 ( SELECT * FROM Site) 时,我会看到该位置的相同二进制 blob,而当我查看坐标 ( SELECT *, AsText(Position) FROM Site) 时,我也会看到相同的值。
那么为什么要使用 GeomFromText 呢?这两种变体之间是否存在任何(已知的)性能差异?这是如何在除 MySQL 之外的其他数据库系统中解决的?
Mic*_*bot 19
有两种与 MySQL 空间扩展相关的不同二进制格式,标准中的“众所周知的二进制”(WKB)格式和 MySQL 内部GEOMETRY数据类型。
在 MySQL 5.1.35 之前,函数 likePOINT()不返回 MySQL 内部数据类型;他们返回了 WKB ......所以在此之前,你必须这样做:
INSERT INTO t1 (pt_col) VALUES (GeomFromWKB(Point(1,2)));
Run Code Online (Sandbox Code Playgroud)
但是现在,就像在您的示例中一样,这有效:
INSERT INTO t1 (pt_col) VALUES(Point(1,2));
Run Code Online (Sandbox Code Playgroud)
Point()值得开发人员称赞的是,当他们将类似函数更改为(更明智地)返回GEOMETRY对象时,他们允许GeomFromWKB()类似函数实际接受 WKB 或 MySQL Geometry 数据作为输入,即使这些函数旨在接受 WKB 作为输入。
第一种方法在较新的服务器上有效(尽管在技术上是错误的),而第二种方法在 MySQL 5.1.35 之前根本不起作用,这一事实可能解释了为什么使用您所见过的方法编写示例——完全避免这个问题。否则……我什么都没有,在这里。
与接受适当变量作为输入的函数相比,连接然后解析文本在直觉上看起来更慢且更容易出错,所以我想不出有任何理由来制作连接字符串并使用基于文本的函数。
http://dev.mysql.com/doc/refman/5.1/en/creating-spatial-values.html#gis-wkb-functions
http://dev.mysql.com/doc/relnotes/mysql/5.1/en/news-5-1-35.html
对于后代来说,唯一重要的是
Point(X,Y)是精确数字的构造函数,不需要先转换为文本,使其更快。它还保证RETURN A POINTOR FAIL。如果你想这样想的话,这使它成为强类型的。ST_前缀的情况下找到;如果可用,请使用带有ST_前缀的版本。仅当您的输入已经是众所周知的文本时才使用 WKT 构造函数。如果没有,请使用Point(x,y)上面的构造函数。
ST_GeomFromText(wkt, srid)可以返回MySQL 支持的任何空间类型,可以用 WKT 表示。如果你想这样想的话,这会使其打字松散。ST_PointFromText(wkt, srid)POINT来自 Well-known text的强类型构造函数。跳过历史课,永远不要GeomFromText(Point(x,y))。这太可怕了,没有支持,没有记录。
| 归档时间: |
|
| 查看次数: |
37524 次 |
| 最近记录: |