この種のものが何度も見られるので、簡単なメモ:prism_worlds
のJOIN (おそらく)そのテーブルのデータは必要ないため、は不要です。あなたは基本的にデータベースに「名前が「何か」に等しい世界のすべての名前を教えてください」と尋ねています。代わりにスカラーサブクエリを使用してください。
prism_worlds.world
に一意のインデックスを作成します
SELECT *
FROM prism_data
WHERE prism_data.world_id = (SELECT w.world_id FROM prism_worlds AS w WHERE w.world = 'DeuxTiersMondes')
LIMIT 1000;
オプティマイザーは、prism_data.world_id
を把握します。 単一の定数値に制約されます。 MySQLは事前にクエリを実行してこの値を把握し、クエリ全体で使用します。 EXPLAIN
を参照してください const
の場合 -サブクエリが実行されました。
prism_data.x
について 、.y
および.z
:ジオメトリ列とそのための空間インデックスを作成することをお勧めします。個別の値に固執する必要がある場合は、ワールドジオメトリ全体を固定サイズのボクセル(単一のintで表される)に分割し、単純なジオメトリを使用して、どの位置がどのボクセルに該当するかを把握することをお勧めします。
私の個人的な解決策は、このテーブルに何億ものクエリを追加することについてあまり考えないことです。インデックスはそれを遅くて大きくします。 cronジョブを使用してレポートテーブル(マテリアライズドビュー)に入力し、事前に結果を生成し、cronジョブが実行されて再度更新される限り、それらを使用します。