sql >> Databáze >  >> RDS >> Mysql

Zlepšení efektivity indexu MySQL – sloupce ve více indexech?

Jen krátká poznámka, protože takové věci jsou vidět znovu a znovu:JOIN na prism_worlds je nepotřebné, protože data z této tabulky (s největší pravděpodobností) nepotřebujete. V podstatě žádáte databázi "uveďte všechna jména světů, pro které se název rovná 'něčemu'". Místo toho použijte skalární poddotaz.

Vytvořte jedinečný index na prism_worlds.world a spusťte dotaz jako

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

Optimalizátor zjistí, že prism_data.world_id je omezena na jednu konstantní hodnotu. MySQL spustí dotaz předem, aby zjistil tuto hodnotu a použil ji po celou dobu dotazu. Viz EXPLAIN pro const -poddotaz proveden.

S ohledem na prism_data.x , .y a .z :Možná budete chtít vytvořit sloupec geometrie a prostorový index. Pokud se potřebujete držet samostatných hodnot, možná budete chtít rozdělit celou geometrii světa na voxely pevné velikosti (reprezentované jedním int) a pomocí jednoduché geometrie zjistit, která pozice spadá do kterého voxelu.

Mým osobním řešením by bylo nedávat příliš mnoho úvah o přidávání milionů dotazů do této tabulky. Díky indexům bude pomalý a velký. Použijte úlohu cron k vyplnění tabulky sestav (materializované zobrazení), abyste získali výsledky s předstihem a používejte je tak dlouho, dokud se úloha cron objeví a znovu je aktualizuje.



  1. Efektivně vyřešte problém s podezřelou databází serveru SQL Server

  2. Konverze časového razítka MySQL na datum Java

  3. Jak mohu dále optimalizovat odvozený tabulkový dotaz, který funguje lépe než ekvivalent JOINed?

  4. MySQL:Proč používat VARCHAR(20) místo VARCHAR(255)?