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

空間mysqlインデックスに結合します

    MySQLが空間インデックスのマージをサポートしていないためだと思います。それがまだ真実かどうかはわかりませんが、私は過去にどこかでそれを読んだことがあります。 ORステートメントがある場合、空間インデックスは使用されません

    あなたの場合、points.id =1をどこで実行していますか。これは、mbrcontainsで使用される1つの結果が返されるストレートセレクトです。それはインデックスを使用します。

    points.in(1,2,3)を追加すると、3つの結果が返され、それぞれが範囲テーブルにマップされる必要があるため、機能しません

    結果

    id  select_type     table   type    possible_keys   key     key_len     ref     rows    filtered    Extra
    1   SIMPLE  points  range   PRIMARY     PRIMARY     4   NULL    3   100.00  Using where
    1   SIMPLE  ranges  ALL     poly    NULL    NULL    NULL    6467418     100.00   
    

    次のようにすることで、ポイントテーブルなしでテストを簡略化できます。SELECT* FROM range where mbrcontains(poly、GEOMFROMWKB(POINT(0、0)))

    id  select_type     table   type    possible_keys   key     key_len     ref     rows    filtered    Extra
    1   SIMPLE  ranges  range   poly    poly    34  NULL    1   100.00  Using where
    

    そして今これ; SELECT * FROM range where mbrcontains(poly、GEOMFROMWKB(POINT(0、0)))OR mbrcontains(poly、GEOMFROMWKB(POINT(10、10)))

    結果

    id  select_type     table   type    possible_keys   key     key_len     ref     rows    filtered    Extra
    1   SIMPLE  ranges  ALL     poly    NULL    NULL    NULL    6467418     100.00  Using where
    

    2番目のケースでは、インデックスを使用しておらず、スキャンしているだけです。

    特定のポイントごとにUNIONを作成することで、クエリにインデックスを使用させることができますが、それが高速になるかどうかはわかりません。ローカルでいくつかのテストを行いましたが、最初のクエリよりも少し時間がかかりました。

    EXPLAIN EXTENDED 
    SELECT *
    FROM points
    FORCE INDEX (PRIMARY )
    LEFT JOIN ranges
    FORCE INDEX ( poly ) ON mbrcontains( poly, point )
    WHERE points.id = 1
    UNION DISTINCT
    SELECT *
    FROM points
    FORCE INDEX (PRIMARY )
    LEFT JOIN ranges
    FORCE INDEX ( poly ) ON mbrcontains( poly, point )
    WHERE points.id = 2
    UNION DISTINCT
    SELECT *
    FROM points
    FORCE INDEX (PRIMARY )
    LEFT JOIN ranges
    FORCE INDEX ( poly ) ON mbrcontains( poly, point )
    WHERE points.id = 3
    

    結果

    id  select_type     table   type    possible_keys   key     key_len     ref     rows    filtered    Extra
    1   PRIMARY     points  const   PRIMARY     PRIMARY     4   const   1   100.00   
    1   PRIMARY     ranges  range   poly    poly    34  NULL    1   100.00  Using where
    2   UNION   points  const   PRIMARY     PRIMARY     4   const   1   100.00   
    2   UNION   ranges  range   poly    poly    34  NULL    1   100.00  Using where
    3   UNION   points  const   PRIMARY     PRIMARY     4   const   1   100.00   
    3   UNION   ranges  range   poly    poly    34  NULL    1   100.00  Using where
    NULL    UNION RESULT    <union1,2,3>    ALL     NULL    NULL    NULL    NULL    NULL    NULL     
    


    1. SparkDataframesUPSERTからPostgresテーブルへ

    2. MSSQLServerからMySQLデータベースへの挿入

    3. Guid は一意であることが保証されていますか?

    4. 正規表現を使用して数字のみを取得する