Cum verificam Fragmentarea în MySQL și com o solutionam

Ce sunt tabelele fragmentate? Dacă există inserții sau ștergeți date aleatoare, indicii pot deveni fragmentați. Fragmentarea înseamnă că ordonarea fizică a paginilor indexate de pe disc nu este aproape de ordonarea index al înregistrărilor de pe pagini sau că există multe pagini neutilizate din blocurile de pagini care au fost alocate la index. Simptomele de tabele fragmentate pot fi : tabelă care poate ocupa mai mult spațiu pe disc decât este necesar sau rezultatele pot mai lente din cauza altului consum de disc I/O. Utilizatorii InnoDB trbuie sa verifice fragmentarea de multe ori ,ca atunci când mărcile InnoDB de date ca șterse ele nu sunt suprascrie cu date noi. Ea doar le marchează ca inutilizabile. Ca urmare, dimensiunea datelor e umflata artificial și recuperare de date este încetinită.

SELECT
TABLE_SCHEMA, TABLE_NAME, CONCAT(ROUND(data_length / ( 1024 * 1024 ), 2), 'MB') DATA,
CONCAT(ROUND(data_free  / ( 1024 * 1024 ), 2), 'MB')FREE
              from information_schema.TABLES
			       where TABLE_SCHEMA
				   NOT IN ('information_schema','mysql') and Data_free < 0;
  • Acum creați o rutină care rulează scriptul de mai jos.
  •  #!/bin/bash
    
    MYSQL_LOGIN='-u<user name> --password=<passowrd>'
    
    for db in $(echo "SHOW DATABASES;" | mysql $MYSQL_LOGIN | grep -v -e "Database" -e "information_schema")
    do
            TABLES=$(echo "USE $db; SHOW TABLES;" | mysql $MYSQL_LOGIN |  grep -v Tables_in_)
            echo "Switching to database $db"
            for table in $TABLES
            do
                    echo -n " * Optimizing table $table ... "
                    echo "USE $db; OPTIMIZE TABLE $table" | mysql $MYSQL_LOGIN >/dev/null
                    echo "done."
            done
    done
    Este bine să ne amintim că, atunci când de-fragmentam o tabela ea o sa fie blocata, deci asigurați-vă că puteți obține blocare tabelei.