sql >> Databasteknik >  >> RDS >> Mysql

Förbättra MySQL-indexeffektiviteten - kolumner i flera index?

Bara en snabb notering eftersom den här typen av saker ses om och om igen:JOIN på prism_worlds är onödig eftersom du (med största sannolikhet) inte behöver data från den tabellen. Du frågar i princip databasen "ge mig alla namn på världar där namnet är lika med 'något'". Använd en skalär underfråga istället.

Skapa ett unikt index på prism_worlds.world och kör frågan 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;

Optimeraren kommer att ta reda på att prism_data.world_id är begränsad till ett enda konstant värde. MySQL kommer att köra en fråga i förväg för att ta reda på detta värde och använda det hela tiden. Se EXPLAIN för const -underfrågan körs.

Angående prism_data.x , .y och .z :Du kanske vill skapa en geometrikolumn och ett rumsligt index för det. Om du behöver hålla dig till separata värden, kanske du vill dela upp hela världsgeometrin i voxlar med fast storlek (representerade av en enda int) och använda enkel geometri för att ta reda på vilken position som faller i vilken voxel.

Min personliga lösning skulle vara att inte ge för många tankar om att lägga till tusentals frågor på denna tabell. Indexen kommer att göra det långsamt och stort. Använd ett cron-jobb för att fylla en rapporttabell (materialiserad vy) för att producera resultaten i förväg och använd dem så länge som cron-jobbet kommer runt och uppdaterar dem igen.



  1. MAMP Mysql-fel - Det gick inte att öppna loggen

  2. Fix:"Okänd tabell 'locales' i informationsschema" i MariaDB

  3. Kan inte fjärransluta till EC2 MySQL-installation

  4. Laravel 5.1 - Homestead MySQL-anslutning. `Anslutning nekad` &`Ingen sådan fil eller katalog`