Proměnná systému MAX_SEEKS_FOR_KEY v MySQL řídí prahovou hodnotu související s rozhodovacím procesem optimalizátoru při výběru, zda použít indexové skenování nebo skenování celé tabulky. Nastavení max_seeks_for_key příliš vysoko přináší několik rizik, která mohou ovlivnit výkon a efektivitu dotazů v databázi MySQL.
max_seeks_for_key představuje předpokládaný maximální počet klíčových hledách, který optimalizátor očekává, když vyhledáš řádek na základě indexového klíče. Ve výchozím nastavení je tato hodnota extrémně vysoká (v 64bitovém systému je obvykle nastavena na 18 446 744 073 709 551 615). To znamená, že se optimalizátor neomezuje při předpokladu, jak drahé vyhledávání klíčů může být indexem.
Když je max_seeks_for_key nastaven velmi vysoký, optimalizátor má tendenci upřednostňovat skenování tabulek před indexovým skenováním, zejména v případech, kdy je kardinálnost indexu (odhadovaný počet jedinečných hodnot v indexu) relativně nízký. To může vést k několika nežádoucím důsledkům:
1. plány suboptimálních dotazů:
Nejvýznamnějším rizikem vysokého max_seeks_for_key je, že optimalizátor dotazů si může vybrat skenování plné tabulky místo účinnějších indexových skenů. Úplné skenování tabulky čte každý řádek v tabulce postupně, což může mít za následek vyšší I/O náklady, pokud je tabulka velká a dotaz potřebuje pouze malou podskupinu řádků. To vede k pomalejším časům provádění dotazů ve srovnání s použitím vhodného indexového skenování.
2. Zvýšené využití zdrojů a latence:
Úplné skenování tabulek často konzumuje více zdrojů CPU a disků I/O, protože musí být prozkoumána každý řádek v tabulce. To může přispět k celkovému zatížení systému, ke zvýšení latence pro dotazy a snížení propustnosti pro server MySQL, zejména při vysoké souběžnosti uživatele nebo s velmi velkými datovými sadami.
3. Špatný výkon na velkých stolech:
Protože plné skenování vyžaduje čtení celé tabulky, nastavení max_seeks_for_key příliš vysokých dopadů negativně pro velké tabulky s mnoha řádky. Dotazy, které by měly v ideálním případě využívat indexy pro rychlé filtrování řádků, místo toho způsobují zdlouhavé trvání skenování a ponižující citlivost na aplikaci.
4. nekonzistentní chování napříč dotazy:
Protože max_seeks_for_key platí globálně, zvýšení jeho hodnoty ovlivňuje všechny dotazy na serveru. Zatímco některé dotazy by mohly mít prospěch z úplných skenů, mnoho dalších optimalizovaných pro indexy může být horší. To přináší nepředvídatelnost a nekonzistentní výkon dotazů, což vyžaduje pečlivé a probíhající experimenty a ladění specifické pro dotaz.
5. Neschopnost efektivně využít indexovou kardinálnost:
Index kardinálnost (odhad odlišných hodnot v indexu) je klíčem k rozhodnutím Optimalizátoru MySQL. Pokud je max_seeks_for_key nastaven příliš vysoko, optimalizátor penalizuje indexové skenování za předpokladu, že by mohly vyžadovat dražší hledání klíčů, než ve skutečnosti dělají, i když by měly být logicky použity indexy vysoké kardinality. V důsledku toho jsou optimalizace založené na indexu nedostatečně využívány nebo ignorovány.
6. Zavádějící statistika optimalizátoru:
Optimalizátor závisí na statistikách, jako je indexová kardinálnost a náklady spojené s vyhledáváním řádků. Když max_seeks_for_key maskuje skutečné náklady tím, že je příliš přípustné, může způsobit, že optimalizátor nesprávně posoudí náklady na přístupy k přístupovým cestám, což ovlivňuje přesnost modelu nákladů Optimizer.
7. Obtížnost řešení problémů s výkonem:
Protože max_seeks_for_key může interagovat složitými způsoby se statistikami indexu a plány dotazů, může to být příliš vysoko, aby diagnostika pomalých dotazů byla náročnější. Může to vést k situacím, kdy indexy ladění nebo přepisování dotazů nepřinášejí očekávaná zlepšení, protože základní předpoklady nákladů v optimalizátoru zůstávají zkreslené.
Shrnutí rizik: Nastavení max_seeks_for_key příliš vysoko způsobuje, že mysql optimalizátor upřednostňuje skenování plné tabulky namísto indexových skenů, což vede k pomalejším časům provádění, zvýšení CPU a I/O zatížení, neefektivní používání indexů, degradované výkonnosti v oblasti dotazu na lanuto naladění.
Tato rizika zdůrazňují, proč se mnoho DBA rozhodlo snížit MAX_SEEKS_FOR_KEY na mírnější úroveň (například 1000 nebo podobné). Snížení hodnoty povzbuzuje optimalizátor, aby upřednostňoval využití indexu před úplným skenováním, když je indexová kardinálnost nad tímto prahem, obvykle zlepšuje rychlost dotazu a snižuje spotřebu zdrojů pro typická pracovní zátěž.
Závěrem lze říci, že zatímco velmi vysoký max_seeks_for_key by se mohl zdát bezpečný, protože neomezuje optimalizátor, v praxi riskuje špatný výkon dotazu, zbytečné zdroje a vyšší latenci v důsledku předčasného skenování plné tabulky, zejména na velkých datových souborech, které by měly být indexovány efektivně.