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

MySQL hash indexy pro optimalizaci

Nejprve se vypořádejte s konkrétními otázkami, které vznesete:

  1. Jak je zdokumentováno v CREATE INDEX Syntaxe :

    Proto ještě před zvažováním HASH indexování, je třeba si uvědomit, že je pouze dostupné v MEMORY a NDB storage motory:to pro vás nemusí být ani volba.

    Dále mějte na paměti, že indexy na kombinacích ID a Lookup samotné nemusí být optimální, protože vaše WHERE predikát také filtruje na tablea.Elg_IDpart1 a tableb.IDpart1 —můžete mít také prospěch z indexování těchto sloupců.

  2. Za předpokladu, že úložiště úložiště podporuje požadované typy indexů, můžete je kombinovat, jak uznáte za vhodné.

  3. Můžete použít nápovědu k indexu přinutit MySQL používat jiné indexy než ty, které by optimalizátor jinak vybral.

  4. Je to obvykle dost chytrý, ale ne vždy. V tomto případě však pravděpodobně určil, že mohutnost indexů je taková, že je lepší použít ty, které si vybrala.

Nyní, v závislosti na verzi MySQL, kterou používáte, tabulky odvozené z poddotazů nemusí mít na sobě žádné indexy, které by bylo možné použít pro další zpracování:následně spojení s b může vyžadovat úplné prohledání této odvozené tabulky (ve vaší otázce není dostatek informací, aby bylo možné přesně určit, jak velký problém by to mohlo být, ale schema1.tableb mít 1,5 milionu záznamů naznačuje, že by to mohl být významný faktor).

Viz Optimalizace poddotazů pro více informací.

Pokud je to možné, měli bychom se proto pokusit vyhnout se použití odvozených tabulek. V tomto případě se nezdá, že by vaše odvozená tabulka měla nějaký účel, protože je možné jednoduše spojit schema1.tablea a schema1.tableb přímo:

UPDATE   schema1.tablea a
    JOIN schema1.tableb b USING (ID, Lookup)
SET      a.Elg_IDpart1 = b.IDpart1, 
         a.Elg_IDpart2 = b.IDpart2
WHERE    a.Elg_IDpart1 IS     NULL
     AND a.ID          IS NOT NULL
     AND b.IDpart1     IS NOT NULL
     AND b.Lookup      IS NOT NULL
ORDER BY ID, Lookup

Jediná věc, která byla ztracena, je filtr pro DISTINCT záznamy, ale duplicitní záznamy jednoduše (pokusí se) přepsat aktualizované hodnoty znovu stejnými hodnotami – což nebude mít žádný účinek, ale mohlo by to být velmi nákladné (zvláště s tolika záznamy v této tabulce).

Použití ORDER BY v odvozené tabulce bylo zbytečné, protože se na ni nedalo spolehnout, že dosáhne nějakého konkrétního pořadí do UPDATE , zatímco v této revidované verzi zajistí, aby všechny aktualizace, které přepisují předchozí, proběhly v určeném pořadí:je to ale nutné? Možná jej lze odstranit a uložit při jakékoli operaci řazení.

Měli byste zkontrolovat predikáty v WHERE klauzule:jsou všechny nutné (NOT NULL zkontroluje a.ID a b.Lookup , například, jsou nadbytečné vzhledem k tomu, že všechny takové NULL záznamy budou odstraněny pomocí JOIN predikát)?

Celkově nám to zbývá:

UPDATE   schema1.tablea a
    JOIN schema1.tableb b USING (ID, Lookup)
SET      a.Elg_IDpart1 = b.IDpart1, 
         a.Elg_IDpart2 = b.IDpart2
WHERE    a.Elg_IDpart1 IS     NULL
     AND b.IDpart1     IS NOT NULL

Pouze pokud je výkon stále neuspokojivý, měli bychom se na indexování podívat dále. Jsou relevantní sloupce (tj. ty, které se používají v JOIN a WHERE predikáty) indexované? Jsou indexy vybírány pro použití MySQL (mějte na paměti, že může používat pouze jeden index na tabulku pro vyhledávání:pro testování jak JOIN predikát a predikáty filtru:možná potřebujete vhodný složený index)? Zkontrolujte plán provádění dotazu pomocí EXPLAIN k dalšímu prošetření takových problémů.




  1. Uživatelská oprávnění MySQL

  2. Co ve skutečnosti znamená číslo v závorce?

  3. Vytvoření tabulky a vložení stejným postupem v pl/sql

  4. Chyba ORA-65048 při změně hesla uživatele v databázi kontejneru (CDB)