Defragmentați tabelele pentru toate bazele de date mysql

Pe măsură ce lucrăm cu bazele de date, le schimbăm constant conținutul. Ceva este șters, adăugat sau actualizat - în orice caz, noile date sunt suprascrise, cele vechi sunt șterse. Ca rezultat, obținem tabele defragmentate care în final pot afecta viteza bazei de date. Metoda de optimizare pentru astfel de tabele este cunoscută mult timp în comanda de optimizare a tabelului în MySQL. Cu toate acestea, comanda nu este destinată optimizării tuturor tabelelor sau a mai multor tabele. Prin urmare, trebuie să efectuați manipulări pentru fiecare tabel separat. Cu toate acestea, dacă există mai multe astfel de tabele, atunci acest lucru este deja dificil. Există o mulțime de scripturi pe Internet care fac mai ușor acest lucru. Iată unul dintre aceste scripturi reciclate care ia în calcul o serie de factori. Tabelele din memorie nu necesită defragmentare, iar tabelele InnoDB nu acceptă această abordare. În plus, ca regulă, toate tabelele sunt optimizate pentru care fragmentarea este mai mare decât 0 - adică chiar și cele care au 1% fragmentare. Desigur, pe mesele mari acest lucru poate face diferența - dar în unele cazuri este mai bine să setați pragul de optimizare. Mai jos este șarpele însuși:

#! / bin / sh
echo -n "Numele de utilizator MySQL:"; citiți numele de utilizator
ecou -n "Parola MySQL:"; stty -echo; citiți parola; stty ecou; ecou
optimize_limit = 5

mysql -u $ username -p "$ password" -NBe "ARĂTAȚI DATELE DE BAZĂ"; | | grep -v "pierdut + găsit" în timp ce citiți baza de date; face
dacă ["$ database" = "mysql"] || ["baza de date $" = "information_schema"]; apoi continuați; fi
mysql -u $ username -p "$ password" -NBe "Afișează STATUSUL TABELULUI;" $ database |
în timp ce citiți numele motorului versiunea rowformat rânduri avgrowlength datalength maxdatalength indexlength datafree autoincrement createtimetimetimetimetimetimetimetime checktimecompletarea checksum createoptions comment;
face
dacă ["$ datalength" -eq "0"] || ["$ motor" = "MEMORY"] || ["$ engine" = "InnoDB"]; apoi continuați; Fi
fragmentare = $ (($ datafree * 100 / $ datalength))
dacă ["fragmentarea $" -gt $ optimize_limit]; atunci
echo "$ $ numele este $ fragmentation% fragmentat."
mysql -u "$ username" -p "$ parola" -NBe "OPTIMIZE TABLE $ name;" "baza de date $"
Fi
făcut
făcut

Când executați scriptul, vi se va solicita numele de utilizator și parola. Utilizatorul trebuie să aibă toate drepturile necesare. De regulă, aceasta este rădăcină. Variabila optimize_limit este limita de optimizare în procente. Da, și un alt punct important. În momentul optimizării mesei - este blocată pentru scriere. Prin urmare, pentru tabele foarte mari, scriptul trebuie să fie rulat într-un moment în care nu există o activitate activă cu tabelele sau, totuși, să se efectueze manual optimizarea.