web-dev-qa-db-ja.com

POINT(X、Y)とGeomFromText( "POINT(X Y)")の違いは何ですか?

MySQLデータベースにいくつかの幾何学的位置を保存したいのですが。これにはPOINTデータ型を使用します。ほとんどすべての場所で、テーブルにデータを挿入するには関数GeomFromTextを使用する必要があると読みました。

ただし、POINT(X,Y)も機能することがわかりました。 GeomFromTextの代わりにPOINTを使用する理由についての説明は見つかりませんでした。

たとえば、次の単純な関係があります。

_CREATE TABLE Site (
    SiteID      BIGINT UNSIGNED,
    Position    POINT
);
_

また、次の2つのバリアントを使用して値を挿入できます。

_INSERT INTO Site (
    1,
    GeomFromText( 'POINT(48.19976 16.45572)' )
);

INSERT INTO Site (
    2,
    POINT(48.19976, 16.45572)
);
_

テーブル(_SELECT * FROM Site_)を表示すると、その場所の同じバイナリblobが表示され、座標(SELECT *, AsText(Position) FROM Site)を表示すると、同じ値も表示されます。

では、なぜGeomFromTextを使用する必要があるのでしょうか。これら2つのバリアントの間に(既知の)パフォーマンスの違いはありますか?これはMySQL以外のデータベースシステムでどのように解決されますか?

18
ComSubVie

MySQL空間拡張に関連する2つの異なるバイナリ形式があります。標準からの "well-known binary"(WKB) 形式と、MySQL内部GEOMETRYデータ型です。

MySQL 5.1.35より前のバージョンでは、POINT()などの関数はMySQLの内部データ型を返しませんでした。彼らはWKBを返しました...その前に、あなたはこれをしなければなりませんでした:

_INSERT INTO t1 (pt_col) VALUES (GeomFromWKB(Point(1,2)));
_

しかし、今、あなたの例のように、これはうまくいきます:

_INSERT INTO t1 (pt_col) VALUES(Point(1,2));
_

開発者の功績として、Point()および類似の関数を(より正気に)GEOMETRYオブジェクトを返すように変更すると、GeomFromWKB()および類似の関数が実際にいずれかのWKBを受け入れるようになりましたまたは、関数がWKBを入力として受け入れることを目的としている場合でも、MySQLジオメトリデータを入力として使用します。

MySQL 5.1.35より前の1つ目の方法は(技術的に間違っていても)新しいサーバーで機能し、2つ目の方法はまったく機能しません。 説明するかもしれない 問題を完全に回避するために、これまでに見たアプローチを使用して例が記述された理由そうでなければ...私はここに何も持っていません。

テキストを連結してから解析することは、適切な変数を入力として受け入れる関数よりも直感的に遅く、エラーが発生しやすいので、連結された文字列を作成してテキストベースの関数を使用する理由は考えられません。

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

17

MySQL 8以降

後世のために重要なことは

  • Point(X,Y)は、精度のある数値のコンストラクターであり、最初にテキストに変換する必要がないため、高速化されます。 RETURN Aも保証されていますPOINT OR FAIL。これによりstronglyそのように考えたい場合は入力します。
  • Well-Known text(WKT) コンストラクタ:これらはalwaysより低速です Well-Known text(WKT) を解析するための追加手順が必要になるため=。古いバージョンでは、これらは_ST__接頭辞なしで見つかる可能性があることに注意してください。可能な場合は、_ST__接頭辞が付いたバージョンを使用してください。 WKTコンストラクターは、入力が既知のテキストである場合にのみ使用してください。そうでない場合は、上記のPoint(x,y)コンストラクタを使用してください。
    • ST_GeomFromText(wkt, srid) 返すことができる[〜#〜]任意[〜#〜]サポートされている空間タイプMySQLによって、WKTで表すことができます。これでlooselyと入力すると、そのように考えることができます。
    • ST_PointFromText(wkt, srid) 既知のテキストからの強く型付けされたPOINT- constructor。

明快さ

履歴レッスンをスキップします[〜#〜]決して[〜#〜]do GeomFromText(Point(x,y))。それは恐ろしく、サポートされておらず、文書化されていません。

4
Evan Carroll