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

おそらく、異なる大陸にあるオブジェクトは、無限に離れていると見なされます。また、テーブルで使用している単位を開示していません。インチを想定します (1 ヤードには 36 インチあります)。

したがって、ポイントを挿入する前に、ヤード内にいるかどうかを判断する必要があります。これを行うには、MySQL geo エクステンション (詳細はこちら) か、少なくとも x 列と y 列、場合によっては z 列に個別のインデックスが必要になります。

ヤード内にポイントはありますか?このクエリは、新しいポイントの周囲 +/- 1 ヤードのバウンディング ボックス内にポイントがあるかどうかを取得します。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 に答える