Типы данных для хранения lng / lat в MySQL

14

Я храню большой список точек lnt / lat в базе данных MySQL. На данный момент это прогнозируемые точки для Великобритании в М, но в долгосрочной перспективе я хотел бы убедиться, что могу хранить координаты точек для всего мира. Какой тип данных я должен использовать?

Я начал использовать decimal(18,12), но не был уверен, нужна ли эта точность или я мог бы просто использовать float. Я включил свой код, на случай, если есть что-то еще, что я должен рассмотреть:

CREATE TABLE UKTest
(
lat FLOAT,
lng FLOAT
)

Я совершенно новичок в SQL, поэтому я не уверен, имеет ли значение тип данных при выполнении запроса. Я предположил, что общая память будет варьироваться в зависимости от типа переменной. Есть ли преимущество использования пространственной базы данных по сравнению с базовой базой данных MySQL для этого типа работы?

djq
источник

Ответы:

16

Этот вопрос также задавался на StackOverlow .

Верхний ответ предлагает пространственные расширения MySQL . Есть нагрузка ссылок на работы с этими расширениями здесь .

Если вы не хотите использовать пространственные типы и получаете значения от устройства GPS или службы геокодирования, вы можете сопоставить свою десятичную точность с источником данных. Общее практическое правило - хранить данные с точностью в два места больше, чем вы будете отображать в приложении.

В примере кода от Google, отображающем точки на карте, они заявляют:

Когда вы создаете таблицу MySQL, вы хотите обратить особое внимание на атрибуты lat и lng. С текущими возможностями масштабирования Google Maps, вам нужно только 6 цифр точности после десятичной дроби.

Чтобы сохранить минимальное пространство для хранения нашей таблицы, вы можете указать, что атрибуты lat и lng являются числами с плавающей запятой (10,6). Это позволит полям хранить 6 цифр после десятичной запятой, плюс до 4 цифр перед десятичной, например -123,456789 градусов

Я бы не беспокоился о различиях в производительности между числовыми типами. Достойные индексы будут иметь гораздо больший эффект.

geographika
источник
+1 за хороший ответ! Это то, что я бы сказал и сделал.
OptimizePrime
Спасибо за ответ - я прочитал документацию по MySQL Spatial Extensions, но как вы начали их использовать? У меня просто есть база данных MySQL по умолчанию на GoDaddy; Я не знаю, с чего мне начать.
djq
1
@celenius maisonbisson.com/blog/post/12147/…
география
1
И ответ обновил со ссылкой на дополнительные ссылки
география
Почему 4 целых числа?
Аликс Аксель
6

Если вы не привязаны к MySQL по какой-либо другой причине, вам стоит рассмотреть возможность использования пространственно включенной базы данных, такой как postgis, у которой есть объект Point (и Line, Polygon и т. Д.) Для обработки этих деталей за вас. Вы также получаете поддержку проекции, когда вносите эти изменения во весь мир.

2019 : для таких людей, как я, которые также не читают комментарии - MySQL поддерживает пространственные типы данных, предположительно медленнее, без доказательств.

Ян Тертон
источник
Примечание. Для новичков и тех, кто читает выше, MySql 5.7+ теперь работает с пространственными индексами.
HopeKing
но это все еще медленно
Ян Тертон
Не могли бы вы помочь с ресурсами, которые показывают, как медленно? Я рассматриваю возможность его использования в проекте с менее чем миллионом записей. Благодарю.
HopeKing
личный опыт нет общедоступных данных. Слишком много проблем с неправильной геометрией и т. Д., Ломающими вещи
Иан Тертон
Благодарю. Мне нужно просто расстояние между точками, основанное на записях базы данных (и никаких сложных требований, таких как Polygon) - поэтому, вероятно, сейчас будет безопасно использовать mysql.
HopeKing