【发布时间】:2010-12-21 06:30:54
【问题描述】:
我有一个 MySQL 数据库。我将房屋存储在数据库中,实际上只对数据库执行 1 次查询,但我需要以超快的速度执行此查询,即返回一个正方形内的所有房屋框地理纬度和经度。
SELECT * FROM homes
WHERE geolat BETWEEN ??? AND ???
AND geolng BETWEEN ??? AND ???
对我来说存储地理数据的最佳方式是什么,以便我可以最快地执行在地理定位框中显示所有家的查询?
基本上:
- 我是否使用最好的 SQL 语句最快地执行此查询?
- 是否存在任何其他方法,甚至可能不使用数据库,让我在盒装地理位置范围内查询房屋结果的最快方式?
如果有帮助,我在下面包含了我的数据库表架构:
CREATE TABLE IF NOT EXISTS `homes` (
`home_id` int(10) unsigned NOT NULL auto_increment,
`address` varchar(128) collate utf8_unicode_ci NOT NULL,
`city` varchar(64) collate utf8_unicode_ci NOT NULL,
`state` varchar(2) collate utf8_unicode_ci NOT NULL,
`zip` mediumint(8) unsigned NOT NULL,
`price` mediumint(8) unsigned NOT NULL,
`sqft` smallint(5) unsigned NOT NULL,
`year_built` smallint(5) unsigned NOT NULL,
`geolat` decimal(10,6) default NULL,
`geolng` decimal(10,6) default NULL,
PRIMARY KEY (`home_id`),
KEY `geolat` (`geolat`),
KEY `geolng` (`geolng`),
) ENGINE=InnoDB ;
更新
我知道空间会影响地球的曲率,但我最感兴趣的是最快返回地理数据。除非这些空间数据库包以某种方式更快地返回数据,否则请不要推荐空间扩展。谢谢
更新 2
请注意,以下没有人真正回答了这个问题。我真的很期待我可能得到的任何帮助。提前致谢。
【问题讨论】:
-
我还推荐阅读 MySQL 的空间功能:dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html
-
“数据不好”是什么意思?我的应用程序正在查看通常不超过 3 英里乘 3 英里宽的数据。所以地球的曲率并没有考虑那么多
-
所有,空间并不快。我正在使用 InnoDB。根据文档“InnoDB 表在 MySQL 5.0.16 之前不支持空间数据类型。从 5.0.16 开始,InnoDB 支持空间数据类型,但不支持它们的索引。”dev.mysql.com/doc/refman/5.0/en/innodb-restrictions.html为什么在文档中你一直推荐 SPATIAL正在让我阅读,并声称我不是在阅读,而是上午,明确指出对于 InnoDB 数据库 - 没有索引会导致查询速度较慢。再一次,我手头的问题是如何对地理数据执行最快的查询?
-
我不想听起来粗鲁,但是当您声称我没有阅读您链接的文档并且当我阅读它时,它清楚地说明了您声称的对立面,这令人沮丧。这让我想,您是否也在阅读您自己链接的文档?
-
UTM 会很尴尬,除非感兴趣区域的宽度小于大约 6 度经度并且最好只有赤道的一侧。如果区域比这更宽,您需要指定一个区域,并且坐标将在区域边界上不连续。在赤道,y 坐标从北方接近零,但从南方接近 10000000。对于经纬度都很大的地区,最简单的坐标系是经纬度。你只需要接受球坐标带来的问题。
标签: mysql database database-design performance