MAX_SEEKS_FOR_KEY-systemvariabeln i MySQL styr en tröskel relaterad till optimeringens beslutsprocess när du väljer om du ska använda en indexskanning eller en fullständig tabellskanning. Att ställa in max_seeks_for_key för hög har flera risker som kan påverka prestandan och effektiviteten för frågor i en MySQL -databas.
max_seeks_for_key representerar det antagna maximala antalet nyckel söker optimeringarna förväntar sig när du letar upp en rad baserat på en indexnyckel. Som standard är detta värde extremt högt (på ett 64-bitars system är det vanligtvis inställt på 18 446 744,073,709,551,615). Detta innebär att optimeringen inte kommer att begränsa sig i att anta hur dyr nyckeluppslag med ett index kan vara.
När max_seeks_for_key är inställd mycket hög, tenderar optimeraren att föredra tabellskanningar framför indexskanningar, särskilt i fall där kardinaliteten för ett index (det uppskattade antalet unika värden i ett index) är relativt lågt. Detta kan leda till flera oönskade konsekvenser:
1. Suboptimal Query Plans:
Den mest betydande risken för en hög max_seeks_for_key är att frågeformatorn kan välja fullständiga tabellskanningar istället för effektivare indexskanningar. Hela tabellskanningar läser varje rad i tabellen i följd, vilket kan resultera i högre I/O -kostnader om tabellen är stor och frågan behöver bara en liten delmängd av rader. Detta leder till långsammare exekveringstider för frågan jämfört med att använda en lämplig indexskanning.
2. Ökad resursanvändning och latens:
Fullständiga tabellskanningar konsumerar ofta mer CPU- och disk I/O -resurser eftersom varje rad i tabellen måste undersökas. Detta kan bidra till den övergripande systembelastningen, öka latensen för frågor och minska genomströmningen för MySQL -servern, särskilt under hög användarenhet eller med mycket stora datasätt.
3. Dålig prestanda på stora bord:
Eftersom fullständiga skanningar kräver att du läser hela tabellen, ställer du in max_seeks_for_key för hög påverkar prestandan negativt för stora bord med många rader. Frågor som idealiskt bör utnyttja index för att snabbt filtrera rader istället medföra långa skanningstider, vilket förnedrar applikationens lyhördhet.
4. Inkonsekvent beteende över frågor:
Eftersom max_seeks_for_key tillämpar globalt, påverkar dess värde på alla frågor på servern. Medan vissa frågor kan dra nytta av fulla skanningar, kan många andra optimerade för index presentera sämre. Detta ger oförutsägbarhet och inkonsekventa frågeställningar, vilket kräver noggrann och pågående frågespecifik experiment och inställning.
5. Underlåtenhet att utnyttja indexkardinalitet effektivt:
Indexkardinalitet (uppskattningen av distinkta värden i indexet) är nyckeln till MySQL Optimizers beslut. Om max_seeks_for_key är inställd för hög, straffar optimeringsindexundersökningarna genom att anta att de kan kräva dyrare nyckelsökningar än de faktiskt gör, även när högkardinalitetsindex bör logiskt användas. Följaktligen underutnyttjas eller ignoreras indexbaserade optimeringar.
6. Misleading Optimizer Statistics:
Optimeraren beror på statistik såsom indexkardinalitet och kostnader förknippade med raduppslag. När max_seeks_for_key maskerar den faktiska kostnaden genom att vara alltför tillåtna, kan det leda till att optimeraren inte bedömer kostnaden för åtkomstvägar, vilket påverkar optimeringens totala kostnadsmodell noggrannhet.
7. Svårighetsfelsökning av prestanda:
Eftersom max_seeks_for_key kan interagera på komplexa sätt med indexstatistik och frågetplaner, kan det göra för högt att diagnostisera långsamma frågor mer utmanande. Det kan leda till situationer där inställningsindex eller omskrivning av frågor inte ger förväntade förbättringar eftersom de grundläggande kostnadsantagandena i Optimizer förblir sned.
Sammanfattning av riskerna: Att ställa in max_seeks_for_key för hög orsakar MySQL Optimizer att gynna fullständiga tabellundersökningar istället för indexundersökningar, vilket leder till långsammare exekveringstider, ökade CPU och I/O -belastning, ineffektiv användning av index, nedbrutna prestanda på stora tabeller, inkonsekventa frågeställningar, felaktiga kostnader för uppskattningar av optimatorn och utmaningar i prestanda och utmaningar.
Dessa risker belyser varför många DBA: er väljer att minska max_seeks_for_key till en mer måttlig nivå (t.ex. 1000 eller liknande). Att sänka värdet uppmuntrar optimeringen att föredra indexanvändning framför full skanningar när indexkardinaliteten är över den tröskeln, vanligtvis förbättrar frågeställningen och minskar resursförbrukningen för typiska arbetsbelastningar.
Sammanfattningsvis, medan en mycket hög max_seeks_for_key kan verka säker eftersom den inte begränsar optimeringen, i praktiken riskerar det dåliga frågeställningar, bortkastade resurser och högre latens på grund av för tidiga bordsskanningar, särskilt på stora datasätt som bör indexeras effektivt.