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


17

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以外のデータベースシステムでどのように解決されますか?


パフォーマンスに違いがあるかどうかはわかりません(私は推測しませんが、それは推測に過ぎません)。ただし、別のテーブルから緯度と経度の値を変換する場合、2番目のアプローチはより簡単です。INSERT INTO Site (Position) SELECT POINT(latitude, longitude) FROM tmp簡単です...SELECT GeomFromText(CONCAT('POINT(',latitude,' ',longitude,')' )) ...
ypercubeᵀᴹ

また、2番目のバリアントは構築がはるかに簡単であるため、通常、MySQLの空間拡張が使用されている場所のほとんどすべてで最初のバリアントが使用されるのではないかと考えています。
ComSubVie

両方のバリアントを使用して、上記の表に10.000.000の場所(ホスト上)を挿入しようとしましたが、測定可能なパフォーマンスの違いは検出されませんでした。
ComSubVie

MySQL 8以降と後世の観点からこれを再評価することを検討してください:dba.stackexchange.com/a/227049/2639
Evan Carroll

回答:


16

MySQLの空間拡張に関連する2つの異なるバイナリ形式、標準からの「既知のバイナリ」(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 Geometryデータのいずれかを入力として実際に受け入れることを許可し、同様の関数を許可しました。

新しいサーバーでは(技術的に間違っているにもかかわらず)第1の方法が機能し、MySQL 5.1.35より前の第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


1
興味深いことに、これはリリースノートでは「脚注」としてのみ言及されており、ドキュメントには記載されていません。したがって、テキストベースのメソッドからは離れていきます。
ComSubVie

1
5年後、MySQLのドキュメントで挿入時にST_GeomFromText()関数を使用する例がまだ提供されているのはなぜですか?この答えはまだ関連していますか?少しわかり
マットキーラン

1
@MattKieran WKBおよびWKTは、地理空間データを表現するための標準化されたオープン形式です。標準指向の地理空間アプリケーションは既にこれらの形式でデータを保持している可能性があるため、これらの例を使用します。これにより、ST_GeomFromText()外部アプリケーションがジオメトリオブジェクトを構築するネイティブSQL関数を使用する必要なく、MySQLが外部ジオメトリを単一の引数および類似の変換関数として受け入れることができます中に発見された空間関数リファレンス。ドキュメントをより適切に編成できます。
マイケル-sqlbot

また、@ MattKieranこの答えは、ドキュメントが示す内容に反して古い例を書くことができる理由、MySQLがこの方法で関数を使用することで示されるように見えるタイプの不一致で動作する理由を説明するという意味でのみ関連しています。ネイティブSQL関数、WKB(バイナリ)、またはWKT(テキスト)の3つの方法はすべて有効です。不要になったのは WKB からのネイティブ関数の戻り値を変換することです。これは、戻り値の型が何年も前のようにWKBではなくなったためです。
マイケル-sqlbot

4

MySQL 8+

後世にとって重要なのは

  • Point(X,Y)は、正確な数値のコンストラクターであり、最初にテキストに変換する必要がないため、高速になります。RETURN A POINTOR FAILも保証されています。このように考えたい場合、これは強く型付けされます。
  • well-knownテキスト(WKT)のコンストラクタは:これらは、常に彼らが解析する追加の工程を必要として、遅くwell-knownテキスト(WKT)を。古いバージョンでは、これらはST_プレフィックスなしで見つけることができました。可能な場合は、ST_プレフィックス付きのバージョンを使用します。入力がすでに既知のテキストである場合にのみ、WKTコンストラクターを使用します。そうでない場合は、Point(x,y)上記のコンストラクターを使用します。
    • ST_GeomFromText(wkt, srid)返すことができANY MySQLにサポートされており、WKTで表現することができ、空間タイプを。このように考えたい場合は、これを緩く入力します。
    • ST_PointFromText(wkt, srid)POINTWell-Known Textの厳密に型指定された-constructor。

明瞭さ

歴史のレッスンをスキップして、絶対にしないでくださいGeomFromText(Point(x,y))。それは恐ろしく、サポートされておらず、文書化されていません。


-1

GeomFromTextまたはその他の* FromText関数を使用すると、SRIDを指定できます。そうでなければできるとは思いません。

PointFromText('POINT(lat lng)', 4326)

これは、つまりPOINT(lng lat)POINT(lat lng)
-Zishanの

MySQLはとにかくSRIDを使用しません。だから、それはかなり役に立たない。SRIDが必要な場合は、PostgreSQL / PostGISに移行してください。
エヴァンキャロル

1
MySQL 8はSRIDを使用します。実際、SRIDが原因で5.7から8に移行したMySQL DBで問題が発生しています。
cmoran92
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.