tables support slow que optimize not mysqltuner instead hace for ejemplo doing does better analyze mysql sql

mysql - slow - table does not support optimize, doing recreate+analyze instead



MySQL OPTIMIZE todas las tablas? (14)

Desde la línea de comando:

mysqlcheck -o <db_name> -u<username> -p

luego escribe la contraseña

MySQL tiene un comando OPTIMIZE TABLE que se puede usar para recuperar espacio no utilizado en una instalación de MySQL. ¿Hay alguna forma (comando incorporado o procedimiento almacenado común) para ejecutar esta optimización para cada tabla en la base de datos y / o la instalación del servidor, o es algo que tendría que crear un script?


Desde phpMyAdmin y otras fuentes puede usar:

SET SESSION group_concat_max_len = 99999999; SELECT GROUP_CONCAT(concat(''OPTIMIZE TABLE `'', table_name, ''`;'') SEPARATOR '''') AS O FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = ''BASE TABLE'' AND table_name!=''dual'' AND TABLE_SCHEMA = ''<your databasename>''

Luego, puede copiar y pegar el resultado en una nueva consulta o ejecutarlo desde su propia fuente.


El MySQL Administrator (parte de las Herramientas de GUI de MySQL) puede hacerlo por usted en un nivel de base de datos.

Simplemente seleccione su esquema y presione el botón de Maintenance en la esquina inferior derecha.

Dado que las herramientas de GUI han alcanzado el estado de final de vida, son difíciles de encontrar en la página mysql. Los encontré en Google: http://dev.mysql.com/downloads/gui-tools/5.0.html

No sé si el nuevo MySQL Workbench también puede hacer eso.

Y puede usar la herramienta de línea de comandos mysqlcheck que también debería poder hacer eso.


El siguiente ejemplo de script php puede ayudarlo a optimizar todas las tablas en su base de datos

<?php dbConnect(); $alltables = mysql_query("SHOW TABLES"); while ($table = mysql_fetch_assoc($alltables)) { foreach ($table as $db => $tablename) { mysql_query("OPTIMIZE TABLE ''".$tablename."''") or die(mysql_error()); } } ?>


Este script de bash aceptará la contraseña de root como opción y la optimizará una por una, con salida de estado:

#!/bin/bash if [ -z "$1" ] ; then echo echo "ERROR: root password Parameter missing." exit fi MYSQL_USER=root MYSQL_PASS=$1 MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}" TBLLIST="" COMMA="" SQL="SELECT CONCAT(table_schema,''.'',table_name) FROM information_schema.tables WHERE" SQL="${SQL} table_schema NOT IN (''information_schema'',''mysql'',''performance_schema'')" for DBTB in `mysql ${MYSQL_CONN} -ANe"${SQL}"` do echo OPTIMIZE TABLE "${DBTB};" SQL="OPTIMIZE TABLE ${DBTB};" mysql ${MYSQL_CONN} -ANe"${SQL}" done


Hice este script ''simple'':

set @a=null,@c=null,@b=concat("show tables where",ifnull(concat(" `Tables_in_",database(),"` like ''",@c,"'' and"),'''')," (@a:=concat_ws('','',@a,`Tables_in_",database(),"`))"); Prepare `bd` from @b; EXECUTE `bd`; DEALLOCATE PREPARE `bd`; set @a:=concat(''optimize table '',@a); PREPARE `sql` FROM @a; EXECUTE `sql`; DEALLOCATE PREPARE `sql`; set @a=null,@b=null,@c=null;

Para ejecutarlo, simplemente péguelo en cualquier IDE de SQL conectado a su base de datos.

Aviso: este código NO funcionará en phpmyadmin.

Cómo funciona

Ejecuta una declaración de show tables y la almacena en una declaración preparada. Luego ejecuta una optimize table en el conjunto seleccionado.

Puede controlar qué tablas optimizar al establecer un valor diferente en la var @c .


Puede optimizar / verificar y reparar todas las tablas de la base de datos, utilizando el cliente mysql.

Primero, debes obtener todas las listas de tablas, separadas con '','':

mysql -u[USERNAME] -p[PASSWORD] -Bse ''show tables'' [DB_NAME]|xargs|perl -pe ''s/ /,/g''

Ahora, cuando tengas todas las listas de tablas para optimización:

mysql -u[USERNAME] -p[PASSWORD] -Bse ''optimize tables [tables list]'' [DB_NAME]


Realice todos los procedimientos necesarios para arreglar todas las tablas en todas las bases de datos con un simple script de shell:

#!/bin/bash mysqlcheck --all-databases mysqlcheck --all-databases -o mysqlcheck --all-databases --auto-repair mysqlcheck --all-databases --analyze


Si accede directamente a la base de datos, puede escribir la siguiente consulta:

OPTIMIZE TABLE table1,table2,table3,table4......;


Si desea analizar, reparar y optimizar todas las tablas en todas las bases de datos en su servidor MySQL, puede hacer esto de una sola vez desde la línea de comandos. Necesitará root para hacer eso sin embargo.

mysqlcheck -u root -p --auto-repair --optimize --all-databases

Una vez que lo ejecute, se le solicitará que ingrese su contraseña de root de MySQL. Después de eso, comenzará y verás los resultados a medida que suceda.

Ejemplo de salida:

yourdbname1.yourdbtable1 OK yourdbname2.yourdbtable2 Table is already up to date yourdbname3.yourdbtable3 note : Table does not support optimize, doing recreate + analyze instead status : OK etc.. etc... Repairing tables yourdbname10.yourdbtable10 warning : Number of rows changed from 121378 to 81562 status : OK

Si no conoce la contraseña de root y está usando WHM, puede cambiarla desde WHM yendo a: Inicio> Servicios SQL> Contraseña de MySQL Root


Un script de inicio bash para listar y ejecutar una herramienta contra los DBs ...

#!/bin/bash declare -a dbs unset opt for each in $(echo "show databases;" | mysql -u root) ;do dbs+=($each) done echo " The system found [ ${#dbs[@]} ] databases." ;sleep 2 echo echo "press 1 to run a check" echo "press 2 to run an optimization" echo "press 3 to run a repair" echo "press 4 to run check,repair, and optimization" echo "press q to quit" read input case $input in 1) opt="-c" ;; 2) opt="-o" ;; 3) opt="-r" ;; 4) opt="--auto-repair -c -o" ;; *) echo "Quitting Application .."; exit 7 ;; esac [[ -z $opt ]] && exit 7; echo " running option: mysqlcheck $opt in 5 seconds on all Dbs... "; sleep 5 for ((i=0; i<${#dbs[@]}; i++)) ;do echo "${dbs[$i]} : " mysqlcheck $opt ${dbs[$i]} -u root done


mis 2centos: comenzar con la tabla con mayor fragmentación

for table in `mysql -sss -e "select concat(table_schema,".",table_name) from information_schema.tables where table_schema not in (''mysql'',''information_schema'',''performance_schema'') order by data_free desc;" do mysql -e "OPTIMIZE TABLE $table;" done


para todas las bases de datos:

mysqlcheck -Aos -uuser -p

Para una optimización de base de datos:

mysqlcheck -os -uroot -p dbtest3


Puede usar mysqlcheck para hacer esto en la línea de comandos.

Una base de datos:

mysqlcheck -o <db_schema_name>

Todas las bases de datos:

mysqlcheck -o --all-databases