gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:45:23 26 4
gpt4 key购买 nike

全部-

所以我需要存储与视频游戏中的对象关联的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com