Nov 2, 2007

Mysql: Tipos de Bases de Datos y bloqueos

3.1.4.1 Tablas ISAM
Las tablas de tipo de Método de acceso secuencial indexado (ISAM) era el estándar
antiguo de Mysql. Estas fueron sustituidas por las tablas MyiSAM en la versión 3.23.
Por lo tanto, es probable que solo se tope con este tipo de tablas si está trabando con
bases de datos antiguas. La principal diferencia entre las dos, es el índice de las
tablas MyISAM es mucho más pequeño que el de las tablas ISAM, de manera que un
SELECT con un índice sobre una tabla MyISAM utilizará mucho menos recursos del
sistema.

3.1.4.2.1 Tablas estáticas
Las tablas estáticas tienen longitud fija. Cada registro tiene asignado exactamente 10
Bytes.
Este tipo de tablas se caracterizan por:
• Ser muy rápidas (ya que Mysql sabe que el segundo nombre comienza
siempre en el carácter número once)
• Resultan sencillas de almacenar en caché.
• Resultan sencillas para reconstruir tras un fallo.
• Requieren más espacio de disco

3.1.4.2.2 Tablas Dinámicas
Las columnas de las tablas dinámicas tienen diferentes tamaños. Auque este tipo de
dato ahorra espacio, resulta sin embargo más complejo.
Las tablas de tipo dinámico presentan las siguientes características:
• Todas las columnas de cadena son dinámicas.
• Por regla general, ocupan mucho menos espacio de disco que las tablas fijas.
• Las tablas requieren un mantenimiento regular para evitar su fragmentación.
• No resulta tan sencillo de reconstruir tras un fallo, especialmente si las tablas
están muy fragmentadas.
3.1.4.2.3 Tablas comprimidas
Las tablas comprimidas son tablas de solo lectura que utilizan mucho menos espacio
en disco.
Son ideales para su uso con datos comprimidos que no cambien (que solo se pueden
leer y no escribir) y donde no exista mucho espacio disponible.
Las tablas comprimidas presentan las siguientes características:
• Las tablas son mucho más pequeñas.
• Como cada registro se comprime de forma separada, la carga de acceso es
reducida.
• Cada columna se podría comprimir de forma diferente, utilizando distintos
algoritmos de compresión.

3.1.4.3 Tablas Merge
Las tablas Merge son la fusión de las tablas MyISAM iguales.
Por lo general se usa cuando las tablas MyISAM comienzan a resultar demasiado
grandes.
Entre las ventajas de estas tablas se pueden mencionar las siguientes:
• Resultan más rápidas en determinadas situaciones.
• El tamaño de la tabla es más pequeño
Desventajas de la tabla Merge:
• Resultan mucho más lentas en búsquedas.
• El comando REPLACE no funciona sobre ellas.

3.1.4.4 Tablas Heap
Las tablas Heap son el tipo de tabla más rápido porque se almacena en memoria y
utilizan un índice asignado. La contrapartida es que como se almacenan en memoria,
en el caso de una falla del sistema, los datos se pierden.
3.1.4.5 Tablas Innodb
Las tablas Innodb son tablas de transacción segura (lo que significa que dispone de
las funciones COMMIT y ROLLBACK). En una tabla MyISAM, la tabla entera se
bloquea al realizar funciones de inserción. Durante esa fracción de segundo, no se
puede ejecutar ninguna otra instrucción sobre la tabla. Innodb utiliza funciones de
bloqueo a nivel de fila de manera que solo se bloquee dicha fila y no toda la tabla, y
se puedan seguir aplicando instrucciones sobre otras filas.

3.1.5 Transacciones y bloqueos
Las consultas sobre la base de datos se ejecutan una después de otra. En el caso de un
sitio Web que sirva páginas, da lo mismo el orden en que la base de datos realice las
consultas, siempre y cuando lo haga rápidamente. Sin embargo, ciertos tipos de
consultas necesitan realizarse en un orden dado, como las que dependen de los
resultados de una consulta anterior, o grupos de actualizaciones que necesitan
realizarse en conjunto. Todos los tipos de tabla pueden utilizar la función de bloqueo,
pero sólo los tipos innodb y BDB disponen de funciones transaccionales integradas.

3.1.6 Las transacciones en las tablas Inodb
La potencia de las tablas innodb procede del uso de transacciones o instrucciones
SQL agrupadas en una. Un ejemplo típico son las transacciones bancarias.
Por ejemplo, si se transfiere una cantidad de dinero desde la cuenta de una persona a
otra, se realizan al menos dos consultas:
UPDATE Persona1 SET Valor = ValorDisponible – ValorADebitar;
UPDATE Persona2 SET Valor = ValorDisponible + ValorADebitar;

El proceso parece claro, pero que ocurriría si algo sale mal durante el proceso y el
sistema falla entre las dos consultas sin que llegue a completarse la segunda. Se
habrá retirado los fondos de la cuenta de la primera persona, se creerá que el pago se
ha realizado. Sin embargo, la segunda persona no estará muy contenta porque el pago
no se ha realizado. En este tipo de transacciones, resulta fundamental asegurarse de
que las dos consultas se levan a cabo o que no se hace ninguna de las dos. Para ello,
se empaquetan en los que se conoce como una transacción, con una instrucción
BEGIN para indicar el inicio de la transacción y una instrucción COMMIT para
indicar el final. Solo tras procesar la instrucción COMMIT, las consultas se habrán
convertido en permanentes. Si algo sale mal a media ejecución, podemos utilizar el
comando ROLLBACK para invertir la parte incompleta de la transacción.

3.1.7 Lecturas coherentes
De manera predeterminada, las tablas innodb realizan una lectura coherente. Esto
significa que al realizar una consulta de selección, Mysql devuelve los valores
presentes de la base de datos hasta la última transacción completada. Si en el
momento de realizar la consulta existe alguna transacción en progreso, los resultados
de las instrucciones UPDATE o INSERT no se reflejarán, con una excepción: la
transacción abierta puede modificarse (puede que haya observado que al realizar la
consulta BEGIN-INSERT-SELECT, se visualizó el resultado insertado). Para poder
verlo, necesita tener dos ventanas abiertas y estar conectado a la base de datos.

3.1.8 Lectura de Bloqueos para actualizaciones
Las lecturas coherentes no siempre resultan adecuadas. Por ejemplo, que ocurriría si
varios usuarios están intentando agregar un nuevo registro en una tabla innotest?
Cada nuevo registro inserta un número ascendente exclusivo, este campo no es clave
principal o un campo de incremento automático, por lo tanto nada impide que cree el
registro duplicado. Sin embargo, no queremos que eso ocurra. Lo que desearíamos es
leer el valor actual e insertar un nuevo valor, incrementando en una unidad. Pero esta
acción no garantiza un valor único.
La forma de evitar resultados erróneos es realizando un bloqueo de actualización
sobre la operación de selección. Si indicamos a Mysql, que estamos realizando una
lectura de actualización, no permitirá que nadie más lea el valor hasta que nuestra
transacción se haya completado.

3.1.9 Bloqueos de lectura en modo compartido
Existe otro tipo de bloqueo de lectura que no devuelve un valor si el valor que está
leyendo ha sido modificado por una transacción incompleta. Devuelve el último
valor, pero no forma parte de una transacción cuya intención es modificar el valor.

3.1.10 Transacciones en tablas BDB
Las tablas BDB procesan las transacciones de forma ligeramente diferente a las
tablas Innodb. Si una persona está realizando una transacción sobre una tabla x, si
esta transacción no está completa, ninguna persona podrá consultar los datos de esta tabla mientras la transacción no finalice.
El periodo de tiempo que puede significar al llevar a cabo esta consulta es
demasiado. El hecho de que no se trate de una consulta de selección “rápida” en las
tablas BDB significa que todas las transacciones que se pospongan pueden dar lugar
a graves problemas de rendimiento.
Como en el caso de las tablas innodb, el modo predeterminado de AUTOCOMMIT =
1. Esto significa que a menos que coloque sus cambios dentro de una transacción
(comenzando con BEGIN), se completarán inmediatamente.

3.1.11 Otros comportamientos transaccionales
Existe una serie de comandos adicionales que finalizan automáticamente una
transacción (en otras palabras, que se comportan como si hubiéramos realizado una
operación de confirmación):
• BEGIN
• ALTER TABLE
• CREATE INDEX
• RENAME TABLE
• TRUNCATE
• DROP TABLE
• DROP DATABASE
• LOCK TABLES
Hay que tener mucho cuidado cuando se realizan transacciones ya que al ejecutar
cualquiera de estos comandos cuando las transacción este a medias, automáticamente
se realizará un COMMIT.

(Manual de Diferencias entre Mysql y Oracle, Diego Javier Burbano, Ecuador)

3 comments:

  1. Buenísima tu sección mysql . Soy programador php+mysql y no conocia las diferencias las diferencias de los tipos de tablas existentes. Felicitaciones. Me sirvió de mucho

    Mauricio

    ReplyDelete
  2. This comment has been removed by the author.

    ReplyDelete
  3. Disculpen, como hago para cambiar el tipo de tabla? tengo una base extensa y no quiero volver a crearla.

    ReplyDelete