2011-08-15 15 views
8

enter image description here¿Cómo solucionar el problema aéreo y efectivo en la tabla InnoDB?

Preguntas:

1 - ¿Qué es la media por arriba? Cuando hago clic en el botón "Optimizar tabla" en la tabla MyISAM, los datos generales y efectivos desaparecen. Me pregunto qué le hará a mi mesa?

2 - ¿Debo preocuparme realmente por los gastos generales y efectivos? ¿Cómo solucionar el problema aéreo y efectivo en la tabla InnoDB?

Respuesta

8

Reparar InnoDB no es tan trivial como hacer clic en un botón. MyISAM es.

Bajo el capó, OPTIMIZE TABLE lo harán a una tabla MyISAM llamada mitb:

  • Crear tabla temporal vacío con misma estructura que mitb
  • datos
  • Copia MyISAM de mitb en la tabla temporal
  • gota mitb tabla tabla temporal
  • Cambiar nombre para mitb
  • Run ANALYZE TABLE contra mitb estadísticas e índices tienda

Optmize TABLE no funciona de esa manera con InnoDB por dos razones principales:

Razón # 1: Disposición de almacenamiento InnoDB

Por defecto, InnoDB tiene innodb_file_per_table discapacitados. Todo InnoDB y su abuela aterrizan en ibdata1. Correr OPTIMIZE TABLE hace lo siguiente a una tabla InnoDB llamada mitb:

  • Crear tabla InnoDB temp vacío con misma estructura que mitb
  • los datos de copia de InnoDB de mitb en la tabla temporal
  • mesa
  • gota mitb
  • Cambiar el nombre de tabla temporal a mitb
  • Ejecutar ANALYZE TABLE contra mitb estadísticas e índices tienda

Desafortunadamente, la tabla temporal utilizada para reducir mytb se agrega a ibdata1. CRECIMIENTO INSTANTÁNEO PARA ibdata1 !!! A la luz de esto, ibdata1 nunca se reducirá. Para empeorar las cosas, ANALYZE TABLE es inútil (Explicado en la RAZÓN # 2)

Si tiene innodb_file_per_table habilitada, los primeros cuatro (4) pasos funcionarán dado que los datos no se almacenan en ibdata1, sino en un archivo de espacio de tablas externo llamado mytb.ibd. Eso puede encogerse.

RAZÓN # 2: Índice de Estadística se vuelven a calcular siempre

InnoDB no almacena de manera efectiva estadísticas de índice. De hecho, si ejecuta ANALYZE TABLE en mytb, las estadísticas se crean y almacenan. Desafortunadamente, por diseño, InnoDB se sumergirá en las páginas BTREE de sus índices, guessimate cardinalidades clave, y usa esos números para preparar MySQL Query Optimizer. Este es un proceso en marcha. En efecto, ANALYZE TABLE es inútil porque las estadísticas de índice calculadas se sobrescriben con cada consulta ejecutada en esa tabla.I wrote about this in the DBA StackExchange June 21, 2011.

Percona explained this thoroughly in www.mysqlperformanceblog.com

cuanto a gastos generales en MyISAM, ese número puede ser resuelto.

Para una tabla MyISAM, la sobrecarga representa la fragmentación interna. Esto es bastante común en una tabla que experimenta, INSERTAR, ACTUALIZAR y SUPRIMIR, especialmente si tiene datos BLOB o columnas VARCHAR. La ejecución de OPTIMIZE TABLE hace que esa fragmentación desaparezca copiando en una tabla temporal (naturalmente, no copia espacio vacío).

Volviendo a InnoDB, ¿cómo se puede eliminar efectivamente el espacio perdido? Debe volver a crear ibdata1 para contener menos información. Withing ibdata1 tiene cuatro tipos de datos:

  • Tabla de Datos Páginas
  • Índice de datos Páginas
  • tabla de metadatos
  • MVCC de datos para transacciones

Puede mover permamnently tabla y los índices de salida de ibdata1 para siempre ¿Qué pasa con los datos y los índices que ya están alojados en ibdata1?

Siga el plan de limpieza InnoDB que yo publicada el 29 de octubre de 2010: Howto: Clean a mysql InnoDB storage engine?

+0

No actualicé o inserté o eliminé nada, acabo de cambiar myisam a innodb, luego el valor de sobrecarga subió a 3,072.0KiB y el valor de efectividad bajó a -3,129,344. ¿Es normal? ¿O realmente tengo que configurar algo antes de cambiar myisam a innodb para evitar problemas generales/efectivos? – zac1987

+0

@ zac1987 esta respuesta parece demasiado tarde, pero puede intentar OPTIMIZAR LA TABLA antes de cambiarla a InnoDB. – Raptor

1

De hecho "TABLA optimizar" es una inútil pérdida de tiempo en MyISAM, ya que si hay que hacerlo, su base de datos es tostadas ya .

Tarda mucho tiempo en tablas grandes y bloquea el acceso de escritura a la tabla mientras lo hace. Por otra parte, tiene efectos muy desagradables en el myisam keycache etc.

Así que en resumen

tablas
  • pequeños no necesitan "optimizar la tabla"
  • grandes mesas nunca puede utilizar "optimizar la mesa" (o, de hecho MyISAM)

es posible lograr (más o menos) la misma cosa en InnoDB simplemente utilizando una sentencia ALTER TABLE, que no realiza cambios de esquema (normalmente ALTER TABLE t ENGINE = InnoDB). No es tan rápido como MyISAM, porque no cumple con las diversas optimizaciones de tabla pequeña que encaja en la memoria.

MyISAM también utiliza un montón de optimizaciones de índice para comprimir páginas de índice, que generalmente causan índices bastante pequeños. InnoDB tampoco tiene estos.

Si su base de datos es pequeña, no la necesita. Si es grande, no se puede usar MyISAM de todos modos (porque un cierre no planificado hace que la tabla necesite una reconstrucción, lo que lleva demasiado tiempo en tablas grandes). Simplemente no use MyISAM si necesita durabilidad, confiabilidad, transacciones, cualquier nivel de concurrencia, o generalmente se preocupa por la solidez de cualquier manera.

+0

¿De verdad que no necesito preocuparme por los gastos generales y efectivos?¿A pesar de que el valor del color rojo aparece en el campo de arriba? – zac1987

Cuestiones relacionadas