在MySQL中存储数百万个3D坐标 - 不好主意?

时间:2012-10-15 18:49:48

标签: mysql position game-engine

全部 -

所以我需要存储与视频游戏中的对象相关联的3D位置(x,y,z)。

我很好奇,这是一个糟糕的主意吗?这些职位的生成频繁,可能会有所不同。

我基本上只想将位置存储在我的数据库中,如果它不在已经存储的位置的范围内。

我基本上选择了游戏中对象的现有位置(通过object_id,object_type,continent和game_version),循环并使用PHP计算距离。如果是> 1,我会插入它。

现在我大约有700万行(显然不是同一个对象),这样效率不高,我正在使用的服务器正在爬行。

有没有人对如何更好地存储这些信息有任何想法?我更喜欢以某种方式在MySQL中。

这是表格的结构:

object_id
object_type (like unit or game object)
x
y
z
continent (an object can be on more than one continent)
game_version (positions can vary based on the game version)

稍后当我需要访问数据时,我基本上只能通过object_id,object_type,continent和game_version查询它(所以我对这些数据有一个索引)

谢谢! 约什

2 个答案:

答案 0 :(得分:3)

据推测,不同大陆上的物体被认为是无限远的。你还没有透露你在桌子上使用的单位。我假设英寸(其中一码有36英寸)。

所以,在你插入一个点之前,你需要确定你是否在一个院子里。为此,您将需要MySQL地理扩展(您可以阅读)或至少在您的x和y列上的单独索引,以及z列。

院子里有没有积分?此查询将告诉您在新点周围+/-一码的边界框内是否有任何点。 “附近”的一个或多个结果表示您不应插入新点。

  SELECT COUNT(*) nearby
    FROM table t
   WHERE t.x between (?xpos - 36) AND (?xpos + 36)
     AND t.y between (?ypos - 36) AND (?ypos + 36)
     AND t.z between (?zpos - 36) AND (?zpos + 36)
     AND t.continent = ?cpos

如果您需要查询使用笛卡尔距离而不是边界框,则可以添加平方和距离计算。但是我怀疑边界框可以很好地适用于你的应用程序,并且比重复获取75行结果集在你的应用程序中进行接近度测试要高效得多。

从概念上讲,为MySQL创建存储过程并不困难,只有在符合接近标准时才有条件地插入新行。这样你就可以有一个简单的单向事务而不是来回的服务器。

答案 1 :(得分:-3)

由于磁盘上的连续活动可以通过让mysql在内存中工作来解决,可能会导致服务器被杀死,添加:ENGINE = MEMORY;在你的桌子上。