2017-04-13 10 views
0

私は、点から点までの距離に近似的に一致する行を見つけることができます。それは動作しますが、インデックスを使用しません。Mysql Spatial index unused

私はこのテーブルの空間インデックスを利用しようとしていますが、使用されていないようです(説明コマンドは "possible_keys" = null)。

  • のMySQL 5.7.17
  • テーブル:

    CREATE TABLE `geoDirections` (
        `id` int(11) NOT NULL, 
        `from` point NOT NULL, 
        `to` point NOT NULL, 
    ) ENGINE=InnoDB; 
    ALTER TABLE `geoDirections` 
        ADD PRIMARY KEY (`id`), 
        ADD SPATIAL KEY `from` (`from`), 
        ADD SPATIAL KEY `to` (`to`); 
    
  • arroundの

    1000000行私が試した何

挿入:以下で

  • 使用ST_Contains

    EXPLAIN SELECT 
        g.`from` 
    FROM 
        geoDirections g 
    WHERE 
        ST_Contains(ST_Buffer(
          ST_GeomFromText('POINT(-2.00751 48.6547)', 4326), (0.00001*20)), g.`from`) = 1 
        AND 
         ST_Contains(ST_Buffer(
          ST_GeomFromText('POINT(-2.05757 48.6338)', 4326), (0.00001*20)), g.`to`) = 1 
    

は、算出した距離を使用して私に

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra  | 
    | 1 | SIMPLE  | g  |  null  | ALL |  null  | null | null | null | 994867 | 100.00 | Using where | 
  • を与える

    EXPLAIN SELECT 
        X(g.`from`),Y(g.`from`), g.*, (
         6373 * acos (
         cos (radians(-2.00751)) 
         * cos(radians(X(g.`from`))) 
         * cos(radians(Y(g.`from`)) - radians(48.6547 )) 
         + sin (radians(-2.00751)) 
         * sin(radians(X(g.`from`))) 
        ) 
    ) AS distanceFrom 
    FROM geoDirections g 
    HAVING distanceFrom < 0.02 
    

は私に

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra  | 
    | 1 | SIMPLE  | g  |  null  | ALL |  null  | null | null | null | 994867 | 100.00 | Using where | 
    を与えてくれ

    EXPLAIN SELECT 
        X(g.`from`),Y(g.`from`), g.* 
    FROM geoDirections g 
    WHERE X(g.`from`) = -2.00751 
    

のような単純な

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | 
    | 1 | SIMPLE  | g  |  null  | ALL |  null  | null | null | null | 994867 | 100.00 | null | 
  • でも何かを与えます

私は何をしないのです(空間インデックスをサポートすることになっwheren't古いInnoDBのバージョンとして)

  • は、MyISAMテーブルへのInnoDBに変換しようとしましたか?

  • +0

    私の[_code_](http://mysql.rjweb.org/doc.php/latlng)修正後にそれを打つかどううーん...私は疑問に思います。 –

    答えて

    1

    Bug #76384 Spatial index not used when checking return values explicitly

    試してみてください。

    mysql> DROP TABLE IF EXISTS `geoDirections`; 
    Query OK, 0 rows affected (0.00 sec) 
    
    mysql> CREATE TABLE `geoDirections` (
        -> `id` INT(11) NOT NULL, 
        -> `from` POINT NOT NULL, 
        -> `to` POINT NOT NULL 
        ->) ENGINE=InnoDB; 
    Query OK, 0 rows affected (0.01 sec) 
    
    mysql> ALTER TABLE `geoDirections` 
        ->  ADD PRIMARY KEY (`id`), 
        ->  ADD SPATIAL INDEX (`from`), 
        ->  ADD SPATIAL INDEX (`to`); 
    Query OK, 0 rows affected (0.00 sec) 
    Records: 0 Duplicates: 0 Warnings: 0 
    
    mysql> EXPLAIN SELECT `g`.`from` 
        -> FROM `geoDirections` `g` 
        -> WHERE 
        ->  ST_Contains(ST_Buffer(
        ->   ST_GeomFromText('POINT(-2.00751 48.6547)', 4326), (0.00001 * 20)), `g`.`from`) 
        ->  AND 
        ->  ST_Contains(ST_Buffer(
        ->   ST_GeomFromText('POINT(-2.05757 48.6338)', 4326), (0.00001 * 20)), `g`.`to`)\G 
    *************************** 1. row *************************** 
          id: 1 
        select_type: SIMPLE 
         table: g 
        partitions: NULL 
         type: ALL 
    possible_keys: from,to 
          key: NULL 
         key_len: NULL 
          ref: NULL 
         rows: 1 
        filtered: 100.00 
         Extra: Using where 
    1 row in set, 1 warning (0.00 sec) 
    
    +0

    私は夢中になった...そのバグを発見してくれてありがとう。 MyISAMの同じバグ – Axi

    +0

    @Axi - 今すぐ実行する速度は? –

    +0

    @RickJames私はチェックしなかったが、今はインデックスを使用している – Axi

    関連する問題