Solo una breve nota perché questo genere di cose si vede più e più volte:The JOIN sui prism_worlds
non è necessario perché (molto probabilmente) non hai bisogno dei dati da quella tabella. In pratica stai chiedendo al database "dammi tutti i nomi di mondi per i quali il nome è uguale a 'qualcosa'". Utilizzare invece una sottoquery scalare.
Crea un indice univoco su prism_worlds.world
ed esegui la query come
SELECT *
FROM prism_data
WHERE prism_data.world_id = (SELECT w.world_id FROM prism_worlds AS w WHERE w.world = 'DeuxTiersMondes')
LIMIT 1000;
L'ottimizzatore scoprirà che prism_data.world_id
è vincolato a un unico valore costante. MySQL eseguirà una query in anticipo per determinare questo valore e utilizzarlo durante tutta la query. Vedi EXPLAIN
per il const
-sottoquery eseguita.
Riguardo a prism_data.x
, .y
e .z
:potresti voler creare una colonna geometrica e un indice spaziale per questo. Se devi attenerti a valori separati, potresti voler separare l'intera geometria del mondo in voxel di dimensioni fisse (rappresentate da un singolo int) e utilizzare una geometria semplice per capire quale posizione cade in quale voxel.
La mia soluzione personale sarebbe non dare troppi pensieri sull'aggiunta di miliardi di query su questo tavolo. Gli indici lo renderanno lento e grande. Utilizzare un processo cron per riempire una tabella di report (vista materializzata) per produrre i risultati in anticipo e utilizzarli finché il processo cron arriva e li aggiorna di nuovo.