MyISAM

MyISAM
Información sobre la plantilla
60*60
Motor de almacenamiento de MySQL
LicenciaGNU
Sitio web
http://dev.mysql.com/doc/refman/5.0/es/myisam-storage-engine.html

MyISAM: Es el motor de almacenamiento por defecto de MySQL. Se basa en el código ISAM y tiene muchas extensiones útiles.

MySQL soporta varios motores de almacenamiento que tratan con distintos tipos de tabla. Los motores de almacenamiento de MySQL incluyen algunos que tratan con tablas transaccionales y otros que no lo hacen: MyISAM trata tablas no transaccionales, proporciona almacenamiento y recuperación de datos rápida, así como posibilidad de búsquedas fulltext.

Cada tabla MyISAM se almacena en disco en tres ficheros. Los ficheros tienen nombres que comienzan con el nombre de tabla y tienen una extensión para indicar el tipo de fichero. Un fichero .frm almacena la definición de tabla. El fichero de datos tiene una extensión .MYD (MYData) . El fichero índice tiene una extensión .MYI (MYIndex).

Características

Características del motor de almacenamiento MyISAM:

  • Todos los datos se almacenan con el byte menor primero. Esto hace que sean independientes de la máquina y el sistema operativo. El único requerimiento para portabilidad binaria es que la máquina use enteros con signo en complemento a dos y formato en coma flotante IEEE. La única área de máquinas que pueden no soportar compatibilidad binaria son sistemas empotrados, que a veces tienen procesadores peculiares. No hay penalización de velocidad al almacenar el byte menor primero; los bytes en un registro de tabla normalmente no están alineados y no es un problema leer un byte no alineado en orden normal o inverso. Además, el código en el servidor que escoge los valores de las columnas no es crítico respecto a otro código en cuanto a velocidad.
  • Ficheros grandes (hasta longitud de 63 bits) se soportan en sistemas de ficheros y sistemas operativos que soportan ficheros grandes.
  • Registros de tamaño dinámico se fragmentan mucho menos cuando se mezclan borrados con actualizaciones e inserciones. Esto se hace combinando automáticamente bloques borrados adyacentes y extendiendo bloques si el siguiente bloque se borra.
  • El máximo número de índices por tabla MyISAM en MySQL 5.0 es 64. Esto puede cambiarse recompilando. El máximo número de columnas por índice es 16.
  • La longitud máxima de clave es 1000 bytes. Esto puede cambiarse recompilando. En caso de clave mayor a 250 bytes, se usa un tamaño de bloque mayor, de 1024 bytes.
  • Las columnas BLOB y TEXT pueden indexarse.
  • Valores NULL se permiten en columnas indexadas.
  • Todos los valores de clave numérica se almacenan con el byte mayor primero para mejor compresión de índice.

Opciones de arranque

Las siguientes opciones de mysqld pueden usarse para cambiar el comportamiento de tablas MyISAM :

--myisam-recover=mode: Cambia el modo para recuperación automática para tablas MyISAM .

--delay-key-write=ALL: No vuelca buffers de clave entre escrituras para cualquier tabla MyISAM .

Las siguientes variables de sistema afectan al comportamiento de tablas MyISAM :

bulk_insert_buffer_size: Tamaño del árbol de caché usado en optimización de inserciones. Este es el límite por flujo.

myisam_max_extra_sort_file_size : Usado para ayudar a MySQL a decidir cuándo usar el método de creación de índice de clave caché lento pero seguro.

myisam_max_sort_file_size: No usa el método de ordenación de índice rápido para crear un índice si el fichero temporal será más grande a este tamaño.

myisam_sort_buffer_size : Cambia el tamaño del búffer usado al recuperar tablas. La recuperación automática se activa si arranca mysqld con la opción --myisam-recover . En ese caso, cuando el servidor abre una tabla MyISAM , chequea si la tabla está marcada como mal cerrada o si el contador de veces que se ha abierto la tabla no es 0 y está ejecuando el servidor con --skip-external-locking. Si alguna de estas condiciones es cierta, ocurre lo siguiente:

  • Se chequea la tabla para errores.
  • Si el servidor encuentra un error, trata de hacer una reparación de tabla rápida (ordenando y sin recrear el fichero de datos).
  • Si falla la reparación debido a un error en el fichero de datos (por ejemplo, error de clave duplicada), el servidor lo intenta otra vez, esta vez recreando el fichero de datos.
  • Si sigue fallando, el servidor trata una vez más con el método de reparación antiguo (escrito registro a registro sin ordenar). Este método debe ser capaz de reparar cualquier clase de error y tiene requerimientos de espacio bajos.

Espacio de las claves

Tablas MyISAM usan índices B-tree. Se puede calcular el tamaño del fichero índice mediante (key_length+4)/0.67, sumado sobre todas las claves. Este es el peor caso en que todas las claves se insertan en orden ordenado y la tabla no tiene ninguna clave comprimida.

Los índices de cadenas de caracteres están comprimidos en espacio. Si la primera parte del índice es una cadena de caracteres, también tiene el prefijo comprimido. La compresión de espacio hace que el fichero índice sea menor que el peor caso si la columna de la cadena de caracteres tiene muchos espacios finales o es una columna VARCHAR que no se usa siempre con la longitud total. La compresión de prefijo se usa en claves que comienzan con una cadena de caracteres. La compresión de prefijo ayuda si hay muchas cadenas de caracteres con un prefijo idéntico.

En tablas MyISAM puede comprimir números prefijo especificando PACK_KEYS=1 cuando crea la tabla. Esto ayuda cuando tiene muchas claves enteras con un prefijo idéntico cuando los números se almacenan con el byte mayor primero.

MyISAM soporta tres formatos de almacenamiento distintos. Dos de ellos (formato fijo y dinámico) se eligen automáticamente en función del tipo de columnas que esté usando. El tercero, formato comprimido, puede ser creado sólo con la utilidad myisampack.

Tablas estáticas

El formato por defecto para MyISAM es el estático. Se usa cuando la tabla no contiene columnas de longitud variable (VARCHAR, BLOB, o TEXT). Cada registro se almacena usando un número de bytes fijo.

De los tres formatos de almacenamiento MyISAM, el formato estático es el más simple y seguro (menos sujeto a corrupción). También es el más rápido de los formatos sobre disco. La velocidad proviene de la facilidad con que se encuentran los registros en el fichero de datos en disco: Cuando se busca un registro basándose en un número de registro en el índice, multiplica el número de registro por la longitud de registro. También al escanear una tabla, es muy fácil leer un número constante de registro con cada operación de lectura de disco.

La seguridad se evidencia si su máquina falla mientras el servidor MySQL está escribiendo en un fichero MyISAM de formato fijo. En este caso myisamchk puede determinar fácilmente dónde comienza cada registro y dónde acaba, así que usualmente puede recuperar todos los registros excepto los parcialmente escritos. Tenga en cuenta que los índices de tabla MyISAM siempre pueden reconstruirse basados en los registros de datos.

Características del formato estático

  • Las columnas CHAR añaden espacios hasta la anchura de columna. Esto también es válido para columnas de tipo NUMERIC y DECIMAL creadas antes de MySQL 5.0.3.
  • Muy rápido.
  • Fácil de cachear.
  • Fácil de reconstruir tras un fallo, ya que los registros se localizan en posiciones fijas.
  • La reorganización no es necesaria a no ser que borre un gran número de registros y quiera devolver espacio libre al sistema operativo. Para ello se puede usar OPTIMIZE TABLE o myisamchk.
  • Usualmente requiere más espacio de disco que para tablas de formato dinámico.

Tablas dinámicas

El formato de almacenamiento dinámico se usa si una tabla MyISAM contiene alguna columna de longitud variable (VARCHAR, BLOB, o TEXT), o si la tabla se crea con la opción ROW_FORMAT=DYNAMIC.

Este formato es un poco más complejo ya que cada columna tiene una cabecera que indica la longitud. Un registro puede acabar en más de una localización cuando es alarga como resultado de una actualización.

Puede usarse OPTIMIZE TABLE o myisamchk para defragmentar una tabla. Si tiene columnas de longitud fija a las que accede o cambia frecuentemente en una tabla que también contenga alguna columna de longitud variable, pueden moverse las columnas de longitud variable a otras tablas para evitar fragmentación.

Características del formato dinámico

  • Todas las columnas de cadenas de caracteres son dinámicas excepto aquéllas con longitud menor a cuatro.
  • Cada registro viene precedido por un bitmap que indica qué columnas contienen la cadena vacía (para columnas de cadenas) o cero (para columnas numéricas). Se debe tener en cuenta que esto no incluye columnas que contienen valores NULL. Si una columna de cadena de caracteres tiene una longitud de cero tras eliminar los espacios en blanco finales, o una columna numérica tiene un valor de cero, se marca en el bitmap y no se guarda en disco. Las cadenas no vacías se guardan como un byte de longitud más al de los contenidos de la cadena.
  • Para tablas de longitud fija normalmente se necesita mucho menos espacio de disco.
  • Cada registro usa sólo tanto espacio como necesita. Sin embargo, si un registro crece, se divide en tantos trozos como haga falta, resultando en una fragmentación de registro. Por ejemplo, si actualiza un registro con información que alarga la longitud del registro, el registro se fragmenta. En este caso, se puede ejecutar OPTIMIZE TABLE o myisamchk de vez en cuando para mejorar el rendimiento.
  • Más difícil de reconstruir tras un fallo que las tablas de formato estático, ya que los registros pueden fragmentarse en varios trozos y puede faltar algún enlace (fragmento).

Tablas comprimidas

El formato de almacenamiento comprimido es de sólo lectura generado con la herramienta myisampack. Los escaneos de tablas comprimidas son descomprimidas por myisamchk.

Características del formato comprimido

  • Las tablas comprimidas ocupan muy poco espacio. Esto minimiza el uso de disco, lo que es útil al usar discos lentos (como CD-ROMs).
  • Cada registros se comprime por separado, así que hay poca sobrecarga de acceso. La cabecera de un registro ocupa de 1 a 3 bytes en función del registro más grande en la tabla. Cada columna está comprimida de forma distinta. Usualmente hay una árbol de Huffman para cada columna. Algunos de los tipos de compresión son:

- Compresión espacial de sufijo.

- Compresión espacial de prefijo.

- Números con valor de cero se almacenan usando un bit.

- Si los valores de una columna entara tienen un rango pequeño, la columna se almacena usando el tipo menor posible. Por ejemplo, una columna BIGINT (ocho bytes) puede almacenarse como columna TINYINT (un byte) si todos los valores están en el rango de -128 a 127.

- Si una columna tiene sólo un pequeño conjunto de valores posibles, el tipo de columna se convierte a ENUM.

- Una columna puede usar cualquier combinación de los tipos de compresión precedentes.

  • Pueden tratar registros de longitud fija o variable.

Problemas en tablas MyISAM

El formato de fichero que usa MySQL para almacenar datos se ha probado extensivamente, pero siempre hay circunstancias que pueden hacer que las tablas se corrompan.

Tablas MyISAM corruptas

Incluso el formato de tabla MyISAM es muy fiable (todos los cambios hechos en una tabla por un comando SQL se escriben antes que retorne el comando), puede obtener tablas corruptas si cualquiera de los siguientes eventos ocurre:

  • El proceso mysqld muere durante una escritura.
  • La máquina se apaga inesperadamente.
  • Usa un programa externo como myisamchk en una tabla que está siendo modificada por el servidor a la vez.
  • Un bug en el código de MySQL o MyISAM.

Los síntomas típicos de una tabla corrupta son:

  • Obtiene el siguiente error al seleccionar datos de una tabla:

Incorrect key file for table: '...'. Try to repair it

  • Las consultas no obtienen registros en la tabla o retornan datos incompletos.

Puede chequear la salud de una tabla MyISAM usando el comando CHECK TABLE, y reparar una tabla MyISAM corrupta con REPAIR TABLE. Cuando mysqld no está en ejecución, puede chequear o reparar una tabla con el comando myisamchk .

Fuente

  • Artículo Mysql MyISAM y InnoDB. Disponible en: “.lixon.com.ar”. Consultado el 22 de noviembre del 2011