在自学如何优化设计和建立数据库的过程中,我偶然发现了以下问题:为地址存储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);
答案 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个字节。>