2009-03-11 7 views
22

He leído varias veces que después de eliminar una fila en una tabla InnoDB en MySQL, su espacio no se reutiliza, por lo que si hace una gran cantidad de INSERT en una tabla y luego ELIMINA periódicamente algunas filas, la tabla usará más y más espacio en el disco, como si las filas no se hubieran eliminado en absoluto.¿Se vuelve a utilizar el espacio ocupado por las filas eliminadas?

Recientemente me han dicho que el espacio ocupado por las filas eliminadas se vuelve a utilizar, pero solo después de que se hayan completado algunas transacciones e incluso entonces, no del todo. Ahora estoy confundido.

¿Puede alguien darme sentido a esto? Necesito hacer muchos INSERT en una tabla InnoDB y luego cada X minutos que necesito para ELIMINAR registros que tienen más de Y minutos de antigüedad. ¿Tengo algún problema con la creciente tabla InnoDB aquí, o es paranoia?

Respuesta

30

Es la paranoia :)

DB de no crecen en tamaño innecesariamente, pero para el espacio de los problemas de rendimiento no es liberado tampoco.

Lo que probablemente haya escuchado es que si borra registros, no se devuelve el espacio al sistema operativo. En cambio, se mantiene como un espacio vacío para que el DB lo vuelva a usar después.

Esto se debe a:

  • DB tiene que tener algún espacio en disco duro para guardar sus datos; si no tiene espacio, se reserva un espacio vacío al principio.
  • Cuando inserta una nueva fila, se utiliza una parte de ese espacio.
  • Cuando se quede sin espacio libre, se reserva un nuevo bloque, y así sucesivamente.
  • Ahora, cuando elimina algunas filas, para evitar reservar más y más bloques, su espacio se mantiene libre pero nunca se devuelve al sistema operativo, por lo que puede volver a utilizarlo más tarde sin necesidad de reservar nuevos bloques.

Como se puede ver, el espacio es reutilizado, pero nunca da la espalda. Ese es el punto clave de tu pregunta.

+0

Seb, ¿pueden darme algún enlace oficial para esto? –

+0

@GautamSomani Esta es una respuesta de hace 6 años, no tengo enlaces disponibles, pero podría encontrar esto: https://dev.mysql.com/doc/refman/5.1/en/optimize-table.html: ' Las filas eliminadas se mantienen en una lista vinculada y las operaciones subsiguientes de INSERT reutilizan las posiciones de fila antiguas. Puede usar OPTIMIZE TABLE para reclamar el espacio no utilizado y desfragmentar el archivo de datos. Después de grandes cambios en una tabla, esta afirmación también puede mejorar el rendimiento de las declaraciones que usan la tabla, a veces significativamente. "Estoy seguro de que si buscas en Google podrás encontrar más información oficial sobre esto. – Seb

2

en innodb, no hay una forma práctica de liberar espacio.

  • uso por archivo ibdata mesa, que le permitirá eliminar el registro copiar los datos a una nueva tabla y eliminar edad mesa, recuperando así los registros.
  • use mysqldump y lotes enteros de receta para limpiar todo el servidor . Compruebe lo siguiente:
    http://dev.mysql.com/doc/refman/5.0/en/adding-and-removing.html

Todos estos métodos se vuelven poco prácticos cuando se está utilizando enormes mesas (en mi caso son más de 250 GB) y hay que mantenerlos eliminación de registros a un mejor rendimiento.

Usted tendrá que pensar seriamente, si usted tiene suficiente espacio en su disco duro para realizar una de la función anterior (en mi caso no creo que 1 TB es suficiente para todas estas acciones)

con mesa InnoTab (y mysql sí mismo) la opción es bastante limitada si tiene un tamaño de base de datos serio.

+0

Existen soluciones para esto, con las versiones más nuevas de InnoDB y la configuración correcta ('innodb_file_per_table'): http://dev.mysql.com/doc/innodb-plugin/1.0/en/innodb-other-changes-truncate. html http://dev.mysql.com/doc/refman/5.5/en/innodb-truncate-table-reclaim-space.html – Blaisorblade

Cuestiones relacionadas