Jen krátká poznámka, protože takové věci jsou vidět znovu a znovu:JOIN na prism_worlds
je nepotřebné, protože data z této tabulky (s největší pravděpodobností) nepotřebujete. V podstatě žádáte databázi "uveďte všechna jména světů, pro které se název rovná 'něčemu'". Místo toho použijte skalární poddotaz.
Vytvořte jedinečný index na prism_worlds.world
a spusťte dotaz jako
SELECT *
FROM prism_data
WHERE prism_data.world_id = (SELECT w.world_id FROM prism_worlds AS w WHERE w.world = 'DeuxTiersMondes')
LIMIT 1000;
Optimalizátor zjistí, že prism_data.world_id
je omezena na jednu konstantní hodnotu. MySQL spustí dotaz předem, aby zjistil tuto hodnotu a použil ji po celou dobu dotazu. Viz EXPLAIN
pro const
-poddotaz proveden.
S ohledem na prism_data.x
, .y
a .z
:Možná budete chtít vytvořit sloupec geometrie a prostorový index. Pokud se potřebujete držet samostatných hodnot, možná budete chtít rozdělit celou geometrii světa na voxely pevné velikosti (reprezentované jedním int) a pomocí jednoduché geometrie zjistit, která pozice spadá do kterého voxelu.
Mým osobním řešením by bylo nedávat příliš mnoho úvah o přidávání milionů dotazů do této tabulky. Díky indexům bude pomalý a velký. Použijte úlohu cron k vyplnění tabulky sestav (materializované zobrazení), abyste získali výsledky s předstihem a používejte je tak dlouho, dokud se úloha cron objeví a znovu je aktualizuje.