Длина пространственного индекса Mysql = 0 не используется для точки (SRID 4326) - PullRequest
0 голосов
/ 14 ноября 2018

Почему mysql не создает пространственный индекс (это означает, что длина пространственного индекса = 0 индекс не был создан)?
ИЛИ возможно
Почему в запросе не используется пространственный индекс (длина индекса не показатель)?

Mysql версии 8.0.13 (на 5.7.24 работают хорошо)

CREATE TABLE `boundaries`.`nodes_coastline` (
   `id` bigint(64) NOT NULL,
   `coords` point NOT NULL,
   `coordsSRID` point NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT;
ALTER TABLE `boundaries`.`nodes_coastline` 
    ADD PRIMARY KEY (`id`), 
    ADD SPATIAL KEY `coords` (`coords`), 
    ADD SPATIAL KEY `coordsSRID` (`coordsSRID`);
ALTER TABLE `boundaries`.`nodes_coastline` MODIFY `id` bigint(64) NOT NULL AUTO_INCREMENT;

SELECT  N.id AS node_id,
        NC.id AS coastline_node_id,
        ST_DISTANCE_SPHERE(POINT(N.longitude, N.latitude), NC.coords) / 1000 AS distanceKm
FROM    nodes N,
        way_nodes WN,
        nodes_coastline NC
WHERE   ST_CONTAINS(
            ST_GEOMFROMTEXT(
                ST_ASTEXT(
                    ST_MAKEENVELOPE(
                        POINT((N.longitude + 1 / 111.1), (N.latitude + 1 / 111.1)),
                        POINT((N.longitude - 1 / 111.1), (N.latitude - 1 / 111.1))
                    )
                ),
                4326
            ),
            NC.coordsSRID
        ) 
        AND WN.node_id = N.id 
        AND WN.id = 586687989
ORDER BY distanceKm
LIMIT 1;

ОБЪЯСНИТЬ

| id | select_type | table | partitions | type   | possible_keys      | key     | key_len | ref        | rows     | filtered | Extra                                             |
| 1  | SIMPLE      | WN    | NULL       | ref    | PRIMARY,ix_node_id | PRIMARY | 8       | const      | 122      | 100.00   | Using temporary; Using filesort                   |
| 1  | SIMPLE      | N     | NULL       | eq_ref | PRIMARY            | PRIMARY | 8       | WN.node_id | 1        | 100.00   | NULL                                              |
| 1  | SIMPLE      | NC    | NULL       | ALL    | NULL               | NULL    | NULL    | NULL       | 55400618 | 100.00   | Using where; Using join buffer (Block Nested Loop)|

РЕДАКТИРОВАТЬ
Я нашел ответ:

  1. Поле не было создано с SRID 4326, но данные были.
  2. Функция ST_Contains не имеет статической геометрии.В моем запросе POINT (N.longitude, N.latitude).

Но мне нужны динамические POINT.Итак, как переписать этот запрос для его поддержки?

...