簡體   English   中英

MySQL空間索引未使用

[英]Mysql Spatial index unused

我正在尋找能夠找到從點到點近似匹配的行(假設在20米之內)。 它有效,但不使用索引。

我試圖利用此表上的空間索引,但似乎沒有使用(解釋命令給我“ 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`); 
  • 插入了約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    |  null   |
  • 甚至簡單

     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    |  Using where |
  • 嘗試將InnoDb轉換為MyIsam(較早的InnoDb版本不支持空間索引)

我想念什么?

錯誤#76384明確檢查返回值時未使用空間索引

嘗試:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM