Как использовать пространственные индексы с MySQL 8 без ошибок? - PullRequest
0 голосов
/ 01 апреля 2020

Я получаю эту ошибку:

3674 The spatial index on column 'position' will not be used by the
query optimizer since the column does not have an SRID attribute.
Consider adding an SRID attribute to the column.

Итак, прочитав эту статью: https://mysqlserverteam.com/geographic-indexes-in-innodb/, я решил добавить SRID в столбец, я также пытался прочитать документацию, но Я до сих пор не понимаю, что это такое. Поэтому я делаю так, как написано в тексте, и добавляю это так:

DROP DATABASE IF EXISTS `gis`;

CREATE DATABASE IF NOT EXISTS `gis`
    DEFAULT CHARACTER SET utf8
    DEFAULT COLLATE utf8_general_ci;

USE `gis`;

DROP TABLE IF EXISTS user;
CREATE TABLE IF NOT EXISTS user (
    id           INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    firstname    VARCHAR(48) NOT NULL,
    gender       ENUM('male', 'female') NOT NULL,
    age          TINYINT UNSIGNED NOT NULL,
    position     POINT NOT NULL SRID 4326
);

ALTER TABLE user ADD SPATIAL INDEX(position);

И затем я пытаюсь добавить несколько строк:

INSERT INTO user (firstname, gender, age, position) VALUES ('Alexander', 'male', 34, POINT(63.429909, 10.393035));
INSERT INTO user (firstname, gender, age, position) VALUES ('Dina', 'female', 21, POINT(63.426300, 10.392481));
INSERT INTO user (firstname, gender, age, position) VALUES ('Martin', 'male', 32, POINT(63.422304, 10.432027));
INSERT INTO user (firstname, gender, age, position) VALUES ('Tina', 'female', 19, POINT(63.430603, 10.373038));
INSERT INTO user (firstname, gender, age, position) VALUES ('Kristin', 'female', 20, POINT(63.434858, 10.411359));
INSERT INTO user (firstname, gender, age, position) VALUES ('Mette', 'female', 33, POINT(63.420422, 10.403811));
INSERT INTO user (firstname, gender, age, position) VALUES ('Andres', 'male', 34, POINT(63.419488, 10.395722));
INSERT INTO user (firstname, gender, age, position) VALUES ('Sandra', 'female', 25, POINT(63.432053, 10.408738));
INSERT INTO user (firstname, gender, age, position) VALUES ('Kine', 'female', 29, POINT(63.432302, 10.412643));
INSERT INTO user (firstname, gender, age, position) VALUES ('Henrik', 'male', 25, POINT(63.421055, 10.443288));

Но я получаю ошибку:

Error Code: 3643. The SRID of the geometry does not match the SRID of the column 'position'.
The SRID of the geometry is 0, but the SRID of the column is 4326.
Consider changing the SRID of the geometry or the SRID property of the column.

Если я удалю SRID, тогда индекс не будет работать, когда я выполняю запрос, подобный этому, с EXPLAIN:

SET @distance = 3.5;
SET @my_place_lng = 63.431592;
SET @my_place_lat = 10.396210;

EXPLAIN SELECT
    id,
    firstname,
    gender,
    age,
    ST_Distance_Sphere(Point(@my_place_lng, @my_place_lat), position) AS distance_from_me
FROM user
WHERE
    ST_Contains(ST_MakeEnvelope(
        Point((@my_place_lng+(@distance/111)), (@my_place_lat+(@distance/111))),
        Point((@my_place_lng-(@distance/111)), (@my_place_lat-(@distance/111)))
    ), position)
ORDER BY distance_from_me ASC;

Что я могу сделать? Я даже не знаю, где читать, чтобы понять больше, не видел примеров, которые я понимаю.

1 Ответ

1 голос
/ 01 апреля 2020

укажите значение SRID для геометрии, используя функцию ST_SRID, т.е.

оберните определение точки

... , 34,          POINT(63.429909, 10.393035        ));

следующим образом:

... , 34, ST_SRID( POINT(63.429909, 10.393035) ,4326) );
          ^^^^^^^^                             ^^^^^^

Примечание что значение SRID для геометрий также необходимо будет установить в примере запроса.

MySQL Справочное руководство говорит, что вместо создания геометрии в SRID 0 и последующего приведения ее к SRID 4326, предпочтительной альтернативе это создать геометрию в SRID 4326 напрямую, например,

... , 34, ST_PointFromText('POINT(63.429909, 10.393035)',4326) ));
          ^^^^^^^^^^^^^^^^^^                           ^^^^^^^

Если мы не хотим этого делать, то другой (менее желательный) альтернативой будет установить значение SRID столбца значение по умолчанию 0, а не 4326. Когда мы не устанавливаем значение SRID, MySQL использует значение по умолчанию, равное 0. Но тогда мы будем работать в системе координат без плоской плоскости. Это нехорошо, если мы хотим, чтобы геометрия POINT обрабатывалась как координаты широты / долготы GPS-градусов Земли.


Ссылка:

https://dev.mysql.com/doc/refman/8.0/en/gis-general-property-functions.html#function_st -srid

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...