Mysql
 sql >> Base de données >  >> RDS >> Mysql

Améliorer l'efficacité de l'index MySQL - des colonnes dans plusieurs index ?

Juste un petit mot parce que ce genre de chose se voit encore et encore :Le JOIN sur les prism_worlds n'est pas nécessaire car vous n'avez (très probablement) pas besoin des données de cette table. Vous demandez essentiellement à la base de données "donnez-moi tous les noms de mondes pour lesquels le nom est égal à" quelque chose "". Utilisez plutôt une sous-requête scalaire.

Créer un index unique sur prism_worlds.world et exécutez la requête comme

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'optimiseur déterminera que prism_data.world_id est contraint à une seule valeur constante. MySQL exécutera une requête à l'avance pour déterminer cette valeur et l'utiliser tout au long de la requête. Voir EXPLAIN pour la const -sous-requête exécutée.

Concernant prism_data.x , .y et .z :Vous pouvez créer une colonne de géométrie et un index spatial pour cela. Si vous devez vous en tenir à des valeurs distinctes, vous pouvez séparer la géométrie du monde entier en voxels de taille fixe (représentés par un seul int) et utiliser une géométrie simple pour déterminer quelle position correspond à quel voxel.

Ma solution personnelle serait de ne pas donner trop de réflexions sur l'ajout de milliards de requêtes sur cette table. Les index le rendront lent et gros. Utilisez une tâche cron pour remplir un tableau de rapport (vue matérialisée) afin de produire les résultats à l'avance et de les utiliser tant que la tâche cron revient et les met à jour à nouveau.