Bare en hurtig bemærkning, fordi denne slags ting ses igen og igen:JOIN på prism_worlds
er unødvendig, fordi du (sandsynligvis) ikke har brug for dataene fra den tabel. Du beder dybest set databasen "giv mig alle navne på verdener, for hvilke navnet er lig med 'noget'". Brug i stedet en skalær underforespørgsel.
Opret et unikt indeks på prism_worlds.world
og kør forespørgslen som
SELECT *
FROM prism_data
WHERE prism_data.world_id = (SELECT w.world_id FROM prism_worlds AS w WHERE w.world = 'DeuxTiersMondes')
LIMIT 1000;
Optimizeren vil finde ud af det prism_data.world_id
er begrænset til en enkelt konstant værdi. MySQL vil køre en forespørgsel i forvejen for at finde ud af denne værdi og bruge den hele vejen igennem forespørgslen. Se EXPLAIN
for const
-underforespørgsel udført.
Med hensyn til prism_data.x
, .y
og .z
:Du vil måske oprette en geometrikolonne og et rumligt indeks for det. Hvis du skal holde dig til separate værdier, vil du måske opdele hele verdensgeometrien i voxels af fast størrelse (repræsenteret af en enkelt int) og bruge simpel geometri til at finde ud af, hvilken position der falder ind i hvilken voxel.
Min personlige løsning ville være ikke at give for mange tanker om at tilføje gazillioner af forespørgsler på denne tabel. Indekserne vil gøre det langsomt og stort. Brug et cron-job til at udfylde en rapporteringstabel (materialiseret visning) for at producere resultaterne på forhånd og brug dem, så længe cron-jobbet kommer rundt og opdaterer dem igen.