Spremenljivka sistema max_seeks_for_key v MySQL nadzoruje prag, povezan s postopkom odločanja optimizatorja pri izbiri, ali uporabite indeksno skeniranje ali celotno skeniranje tabele. Nastavitev max_seeks_for_key previsok nosi več tveganj, ki lahko vplivajo na uspešnost in učinkovitost poizvedb v bazi podatkov MySQL.
max_seeks_for_key predstavlja predvideno največje število ključa, ki ga optimizator pričakuje, ko poišče vrstico na podlagi indeksnega ključa. Ta vrednost je privzeto izjemno visoka (v 64-bitnem sistemu je običajno nastavljena na 18.446.744,073,709,551,615). To pomeni, da se optimizator ne bo omejil pri predpostavki, kako drago je lahko iskanje ključa z indeksom.
Ko je Max_seeks_for_key nastavljen zelo visoko, optimizator raje preglede tabele prek indeksnih pregledov, zlasti v primerih, ko je kardinalnost indeksa (ocenjeno število edinstvenih vrednosti v indeksu) razmeroma nizka. To lahko privede do več nezaželenih posledic:
1. Subptimalni poizvedbeni načrti:
Najpomembnejše tveganje za visok max_seeks_for_key je, da lahko optimizator poizvedb izbere preglede s polnimi tabelami namesto učinkovitejših indeksnih pregledov. Pregledi celotne tabele preberejo vsako vrstico v tabeli zaporedno, kar lahko povzroči večje stroške V/I, če je tabela velika in poizvedba potrebuje le majhno podskupino vrstic. To vodi do počasnejših časov izvajanja poizvedb v primerjavi z uporabo ustreznega indeksnega skeniranja.
2. Povečana poraba virov in zamuda:
Pregledi celotne tabele pogosto porabijo več CPU -ja in V/I virov, ker je treba pregledati vsako vrstico v tabeli. To lahko prispeva k celotni sistemski obremenitvi, poveča zamude za poizvedbe in zmanjša prepustnost za strežnik MySQL, zlasti pod visoko uporabniško sočasnostjo ali z zelo velikimi nabori podatkov.
3. Slaba zmogljivost na velikih mizah:
Ker celotne preglede zahtevajo branje celotne tabele, nastavitev max_seeks_for_key previsoko vpliva na uspešnost negativno za velike tabele z mnogimi vrsticami. Poizvedbe, ki bi morale v idealnem primeru uporabiti indekse, da hitro filtrirajo vrstice, namesto da bi imeli dolgotrajno trajanje skeniranja, kar poslabša odzivnost aplikacije.
4. Neskladno vedenje med poizvedbami:
Ker Max_seeks_for_key uporablja globalno, povečanje njene vrednosti vpliva na vse poizvedbe na strežniku. Medtem ko bi nekatere poizvedbe lahko imele koristi od popolnih pregledov, bi se mnogi drugi optimizirani za indekse lahko poslabšale. To prinaša nepredvidljivost in nedosledno uspešnost poizvedb, ki zahtevajo skrbno in stalno eksperimentiranje in uglaševanje, specifično za poizvedbe.
5. Neupoštevanje indeksa kardinalnosti učinkovito:
Indeksna kardinalnost (ocena različnih vrednosti v indeksu) je ključna za odločitve MySQL Optimizer. Če je Max_seeks_for_key nastavljen previsok, optimizator kaznuje indeksne preglede, če predpostavimo, da morda zahtevajo dražje ključne, kot dejansko, tudi kadar je treba logično uporabiti indekse visoke kardinalnosti. Posledično so optimizacije, ki temeljijo na indeksu, premalo izkoriščene ali prezrte.
6. Statistični podatki o zavajanju optimizatorja:
Optimizator je odvisen od statističnih podatkov, kot so indeksna kardinalnost, in stroški, povezani z iskanjem vrstic. Ko max_seeks_for_key prikrije dejanske stroške, tako da je pretirano dovoljen, lahko optimizator napačno presodi stroške dostopnih poti, kar vpliva na skupno natančnost modela stroškov optimizatorja.
7. Težave odpravljanja težav z uspešnostjo:
Ker lahko max_seeks_for_key na zapletene načine komunicira z indeksnimi statistikami in poizvedbenimi načrti, če je nastavitev previsoka, lahko diagnosticiranje počasnih poizvedb postane bolj zahtevno. To lahko privede do situacij, ko indeksi uglaševanja ali prepisovanje poizvedb ne prinesejo pričakovanih izboljšav, ker temeljne predpostavke stroškov v optimizatorju ostajajo nagnjene.
Povzetek tveganj: Nastavitev max_seeks_for_key Previsoka Vzrok za optimizator MySQL je naklonjen pregledom polne tabele namesto indeksnih pregledov, kar vodi do počasnejših časov izvedbe, povečanemu CPU -ju in obremenitvi V/I, neučinkovita uporaba indeksov, poslabša uspešnost na velikih tabelah, in si prizadeva za to, da se zmogljivosti zavajajo.
Ta tveganja poudarjajo, zakaj se mnogi DBA odločijo, da bodo zmanjšali max_seeks_for_key na bolj zmerno raven (na primer 1000 ali podobno). Zniževanje vrednosti spodbuja optimizator, da raje porabo indeksa pri popolnih pregledih, kadar je indeksna kardinalnost nad tem pragom, običajno izboljša hitrost poizvedb in zmanjšanje porabe virov za tipične delovne obremenitve.
Čeprav se zelo visok max_seeks_for_key morda zdi varen, saj ne omejuje optimizatorja, v praksi tvega slabe zmogljivosti poizvedb, zapravljene vire in večje zamude zaradi prezgodnjega pregleda polne tabele, zlasti na velikih naborih podatkov, ki jih je treba učinkovito indeksirati.