Nejprve se vypořádejte s konkrétními otázkami, které vznesete:
-
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é vMEMORY
aNDB
storage motory:to pro vás nemusí být ani volba.Dále mějte na paměti, že indexy na kombinacích
ID
aLookup
samotné nemusí být optimální, protože vašeWHERE
predikát také filtruje natablea.Elg_IDpart1
atableb.IDpart1
—můžete mít také prospěch z indexování těchto sloupců. -
Za předpokladu, že úložiště úložiště podporuje požadované typy indexů, můžete je kombinovat, jak uznáte za vhodné.
-
Můžete použít nápovědu k indexu přinutit MySQL používat jiné indexy než ty, které by optimalizátor jinak vybral.
-
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ů.