Apenas uma nota rápida, porque esse tipo de coisa é visto repetidamente:O JOIN no
prism_worlds
é desnecessário porque você (provavelmente) não precisa dos dados dessa tabela. Você está basicamente pedindo ao banco de dados "dê-me todos os nomes de mundos para os quais o nome é igual a 'algo'". Em vez disso, use uma subconsulta escalar. Crie um índice exclusivo em
prism_worlds.world
e execute a consulta como SELECT *
FROM prism_data
WHERE prism_data.world_id = (SELECT w.world_id FROM prism_worlds AS w WHERE w.world = 'DeuxTiersMondes')
LIMIT 1000;
O otimizador descobrirá que
prism_data.world_id
é restrito a um único valor constante. O MySQL executará uma consulta antecipadamente para descobrir esse valor e usá-lo ao longo da consulta. Consulte EXPLAIN
para o const
-subconsulta executada. Em relação a
prism_data.x
, .y
e .z
:Você pode querer criar uma coluna geométrica e um índice espacial para isso. Se você precisar manter valores separados, você pode querer separar toda a geometria do mundo em voxels de tamanho fixo (representado por um único int) e usar geometria simples para descobrir qual posição se encaixa em qual voxel. Minha solução pessoal seria não pensar muito em adicionar gazilhões de consultas nesta tabela. Os índices vão torná-lo lento e grande. Use um cron job para preencher uma tabela de relatórios (visualização materializada) para produzir os resultados antecipadamente e usá-los enquanto o cron job aparecer e os atualizar novamente.