在性能方面,在mysql中存储lon和lat GEO数据的最佳方法是什么?

时间:2018-07-30 16:42:03

标签: mysql database-performance scaling

在自学如何优化设计和建立数据库的过程中,我偶然发现了以下问题:为地址存储GEO位置的最佳方法是什么?

经过一些研究,我发现有两种可能性。使用MySQL geometry函数并将它们作为point(lon, lat)存储在单个列中。

或将它们存储在lon float(10,6)float(10,6)的2个单独的列中。

但是我发现关于几何函数将使用多少字节来存储信息的信息很少。

示例创建表脚本

CREATE TABLE lonlatAsGeometry (
    ID INT,
    lonlat GEOMETRY
);

INSERT INTO lonlatAsGeometry VALUES (1, point(38.34886, -130.42156));

示例2

CREATE TABLE lonlatAsFloat (
    ID INT,
    lon FLOAT(10,6),
    lat FLOAT(10,6)
);

INSERT INTO lonlatAsFloat VALUES (1, 38.34886, -130.42156);

2 个答案:

答案 0 :(得分:0)

我发现float使用4个字节来存储数据,

point最多使用25个字节,具体取决于其中值的长度。

来源= https://dev.mysql.com/doc/refman/5.7/en/gis-data-formats.html

答案 1 :(得分:0)

请勿使用FLOAT(m,n)。 lat / lng碰巧可以,但是在插入/提取时会对数字做不必要的事情。

您需要多少分辨率?

Representation       bytes  Resolution      Use
------------------   ----- ---------------  ------
DECIMAL(4,2)/(5,2)     5  1570 m    1.0 mi  Cities
SMALLINT scaled        4   682 m    0.4 mi  Cities
DECIMAL(6,4)/(7,4)     7    16 m     52 ft  Houses/Businesses
MEDIUMINT scaled       6   2.7 m    8.8 ft
FLOAT                  8   1.7 m    5.6 ft
DECIMAL(8,6)/(9,6)     9    16cm    1/2 ft  Friends in a mall
DOUBLE                16   3.5nm     ...    Fleas on a dog

-http://mysql.rjweb.org/doc.php/latlng#representation_choices

回到您的问题...“最优”是什么意思?上面是一些用于最小化存储单独的经/纬度时所用空间的选择。如前所述,POINT占用25个字节。如果您的得分低于100万,那么空间可能不是大问题。但也许“最优”与您的值的使用有关。如果您正在使用SPATIAL功能,那么POINT可能是最佳选择。等等

底线:如果将DECIMAL(6,4)用作纬度(-90..90),将DECIMAL(7,4)用作经度(-180..180),则“地图上的地址”为7个字节。