[英]Mysql Spatial index unused
我正在尋找能夠找到從點到點近似匹配的行(假設在20米之內)。 它有效,但不使用索引。
我試圖利用此表上的空間索引,但似乎沒有使用(解釋命令給我“ possible_keys” = null)。
具有以下內容:
表:
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 |
我想念什么?
嘗試:
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.