sql >> データベース >  >> RDS >> Mysql

遅いロケーションベースの検索結果クエリ

    mysql空間拡張を使用して、緯度と経度をポイントデータ型として保存し、それを空間インデックスにすることができます。このようにして、曲線に沿って座標を並べ替え、寸法を減らし、空間情報を保持することができます。空間インデックスをバウンディングボックスとして使用してクエリをフィルタリングし、ハーベシン数式を使用して最適な結果を選択できます。バウンディングボックスは、大円の半径よりも大きくする必要があります。 Mysqlはいくつかの空間インデックスを持つrtreeを使用し、私の例はz曲線またはヒルベルト曲線に関するものでした: https://softwareengineering.stackexchange.com/questions/113256/what-is-the-difference-between-btree-and-rtree-indexing 次に、地理座標をポイント列に直接挿入できます。 http://dev.mysql.com/doc/refman/5.0/en/creating-spatial-values.html 。または、ジオメトリデータ型を使用できます: http:// markmaunder.com/2009/10/10/mysql-gis-extensions-quick-start/ 。次に、MBRcontains関数を次のように使用できます。 http://dev.mysql.com/doc/refman/4.1/en/relations-on-geometry-mbr.html またはその他の関数: http://dev.mysql.com/doc/refman/5.5/en/functions-for-testing-spatial-relations-between-geometric-objects.html 。したがって、バウンディングボックスが必要です。いくつかの例を次に示します。

    ポイントデータ型の簡単な例を次に示します。

        CREATE SPATIAL INDEX sx_place_location ON place (location)
    
        SELECT  * FROM    mytable
        WHERE   MBRContains
               (
               LineString
                       (
                       Point($x - $radius, $y - $radius),
                       Point($x + $radius, $y + $radius)
                       )
               location
               )
        AND Distance(Point($x, $y), location) <= $radius
    

    バウンディングボックス関数で半径変数を使用しているため、機能するかどうかはわかりません。 MBRwithinは引数を必要としないため、少し単純なようです。 MySQL:ネストされたセットツリーでのスーパーノードの検索の最適化



    1. タイプによって違反された継承セキュリティルール:'MySql.Data.Entity.MySqlEFConfiguration'

    2. MIN()–MySQLの列の最小値を見つける

    3. 接続に失敗したときにPDOがパスワードを出力するのはなぜですか?

    4. MySQLまたはMariaDBデータベースに接続する方法