4

全部-

所以我需要存储与视频游戏中的对象相关联的 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来查询(所以我对这4个有索引)

谢谢!乔什

4

2 回答 2

3

据推测,不同大陆上的物体被认为相距无限远。此外,您还没有披露您在表格中使用的单位。我假设英寸(一码有 36 英寸)。

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

院子内有任何点吗?此查询将让您了解在新点周围 +/- 1 码的边界框内是否有任何点。一个或多个的“附近”结果意味着您不应插入新点。

  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 创建一个存储过程并不难,该存储过程只有在满足邻近条件时才会有条件地插入新行。这样,您就可以进行简单的单向事务,而不是服务器来回进行。

于 2012-10-15T19:05:30.880 回答
-3

它可能会杀死您的服务器,因为磁盘上的连续活动可以通过让 mysql 在内存中工作来修复,添加:ENGINE = MEMORY; 在你的桌子上定义。

于 2012-10-15T19:08:38.603 回答