sql >> Database teknologi >  >> RDS >> Mysql

Forbedring af MySQL-indekseffektivitet - kolonner i flere indekser?

Bare en hurtig bemærkning, fordi denne slags ting ses igen og igen:JOIN på prism_worlds er unødvendig, fordi du (sandsynligvis) ikke har brug for dataene fra den tabel. Du beder dybest set databasen "giv mig alle navne på verdener, for hvilke navnet er lig med 'noget'". Brug i stedet en skalær underforespørgsel.

Opret et unikt indeks på prism_worlds.world og kør forespørgslen som

SELECT *
FROM prism_data 
WHERE prism_data.world_id = (SELECT w.world_id FROM prism_worlds AS w WHERE w.world = 'DeuxTiersMondes')
LIMIT 1000;

Optimizeren vil finde ud af det prism_data.world_id er begrænset til en enkelt konstant værdi. MySQL vil køre en forespørgsel i forvejen for at finde ud af denne værdi og bruge den hele vejen igennem forespørgslen. Se EXPLAIN for const -underforespørgsel udført.

Med hensyn til prism_data.x , .y og .z :Du vil måske oprette en geometrikolonne og et rumligt indeks for det. Hvis du skal holde dig til separate værdier, vil du måske opdele hele verdensgeometrien i voxels af fast størrelse (repræsenteret af en enkelt int) og bruge simpel geometri til at finde ud af, hvilken position der falder ind i hvilken voxel.

Min personlige løsning ville være ikke at give for mange tanker om at tilføje gazillioner af forespørgsler på denne tabel. Indekserne vil gøre det langsomt og stort. Brug et cron-job til at udfylde en rapporteringstabel (materialiseret visning) for at producere resultaterne på forhånd og brug dem, så længe cron-jobbet kommer rundt og opdaterer dem igen.



  1. Sådan droppes en kolonne med en begrænsning i SQL Server

  2. JDBC returnerer MySQLSyntaxError Exception med korrekt sætning

  3. Sammenføjning af to tabeller for at få hele poster

  4. MySQL vælg, hvor JSON-feltegenskaben har værdi