mysql - 在 MySQL 中存储数百万个 3D 坐标——坏主意?

标签 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来查询(所以我对这4个都有索引)

谢谢! 乔希

最佳答案

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

因此,在插入点之前,您需要确定您是否在院子内。为此,您将需要 MySQL geo extension(您可以阅读相关内容)或至少在 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 创建一个存储过程并不会更难,该存储过程只有在满足邻近条件时才会有条件地插入新行。这样一来,您将拥有一个简单的单向交易,而不是来回服务器。

关于mysql - 在 MySQL 中存储数百万个 3D 坐标——坏主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12902068/

相关文章:

php - 我可以在 PHP 中混合使用 MySQL API 吗?

mysql - 如果表2中不存在,如何插入到表1中?

android - Viewpager Adapter getItem 总是调用索引 0 和 1

java - 游戏引擎和LWJGL问题

c++ - 使用 Win32 和 UWP/Xbox 平台支持管理 C++ 应用程序的最佳实践?

php - mySQL 查询,并且未考虑

PHP mySQL JOIN 并显示(3 个表)

CSS 绝对位置对齐

html - 如何用绝对定位和相对定位正确定位

python - 依赖于相同基础的抽象行为?