Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Melhorando a eficiência do índice MySQL - colunas em vários índices?


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.