どのように私はエラーを取得せずにMySQLの8と空間インデックスを使用していますか?

アレックス:

私はこのエラーを取得します:

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;

私に何ができる?私も、私は理解していることを任意の例を見ていない、より理解するために読むことをどこか分かりません。

spencer7593:

使用して、ジオメトリの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値を設定しない場合は、MySQLはデフォルトを使用して、デフォルト値0ではなく4326に列のSRID値を設定することです0の値はしかし、その後、私たちは、座標系単位のない平面で働くことと思います。私たちは、POINTジオメトリはGPS地球度緯度/経度の座標として扱うことにしたい場合はそれは良いではありません。


参照:

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

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=384047&siteId=1
おすすめ