我正在尋找能夠找到近似匹配(假設在20米範圍內)從給定點到點的行。它可以工作,但不使用索引。Mysql空間索引未使用
我想利用這個表上的空間索引,但它似乎並沒有被使用(解釋命令給我「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`);
以防萬一百萬行插入
我試了一下:
使用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應該wheren't支持空間索引)
我缺少什麼?
嗯...我不知道如果我的[_code_(http://mysql.rjweb.org/doc.php/latlng)將在修復後,擊敗它。 –