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

přenos složitého dotazu zabere příliš mnoho času

Potřebujete složený index na průsečíkové tabulce:

ALTER TABLE instruments_tools ADD KEY (id_instrument, id_tool);

Pořadí sloupců v tomto indexu je důležité!

V co doufáte, je, že spojení začnou tabulkou nástrojů a poté vyhledá odpovídající položku indexu ve složeném indexu na základě id_instrument. Poté, jakmile najde tuto položku indexu, má související id_tool zdarma. Nemusí tedy vůbec číst tabulku instrument_tools, stačí mu číst pouze položku rejstříku. To by mělo obsahovat komentář "Using index" ve vašem EXPLAIN pro tabulku nástrojů_nástroje.

To by mělo pomoci, ale nemůžete se vyhnout dočasné tabulce a řazení souborů, protože sloupce, podle kterých seskupujete a podle kterých třídíte, nemohou používat index.

Můžete zkusit, aby se MySQL vyhnula zápisu dočasné tabulky na disk zvětšením velikosti paměti, kterou může použít pro dočasné tabulky:

mysql> SET GLOBAL tmp_table_size = 256*1024*1024;      -- 256MB
mysql> SET GLOBAL max_heap_table_size = 256*1024*1024; -- 256MB

Ten údaj je jen příklad. Nemám ponětí, jak velká by musela být pro dočasnou tabulku ve vašem případě.




  1. Jak vybrat data z tabulky, kde má název tabulky prázdná místa?

  2. Použití sekvenčních hodnot pro primární klíč v dotazu INSERT

  3. Proveďte mysql insert, pouze pokud je tabulka prázdná

  4. Geolokační dotaz MySQL