Cada tabla BDB
se almacena en disco en dos
ficheros. Los ficheros tienen nombres que comienzan con el
nombre de la tabla y tienen una extensión para indicar el tipo
de fichero. Un fichero .frm
almacena la
definición de tabla, y un fichero .db
contiene los datos de tabla e índices.
Para especificar explícitamente que quiere una tabla
BDB
, indíquelo con una opición de tabla
ENGINE
o TYPE
:
CREATE TABLE t (i INT) ENGINE = BDB; CREATE TABLE t (i INT) TYPE = BDB;
BerkeleyDB
es sinónimo de
BDB
en la opción ENGINE
o
TYPE
.
El motor de almacenamiento BDB
proporciona
tablas transaccionales. La forma de usar estas tablas depende
del modo autocommit:
Si está ejecutando con autocommit activado (por defecto),
los cambios en las tablas BDB
se
efectúan inmediatamente y no pueden deshacerse.
Si está ejecutando con autocommit desactivado, los cambios
no son permanentes hasta que ejecuta un comando
COMMIT
. En lugar de hacer un commit
puede ejecutar ROLLBACK
para olvidar los
cambios.
Puede comenzar una transacción con el comando
BEGIN WORK
para suspender autocommit, o
con SET AUTOCOMMIT=0
para desactivar
autocommit explícitamente.
Consulte Sección 13.4.1, “Sintaxis de START TRANSACTION
,
COMMIT
y ROLLBACK
”.
El motor de almacenamiento BDB
tiene las
siguientes características:
En MySQL 5.0, las tablas BDB
pueden tener
hasta 31 índices por tabla, 16 columnas por índice, y un
máximo de tamaño de clave de 1024 bytes.
MySQL necesita una PRIMARY KEY
en cada
tabla BDB
para que cada registro pueda
identificarse unívocamente. Si no crea una explícitamente,
MySQL crea y mantiene una PRIMARY KEY
oculta. La clave oculta tiene una longitud de 5 bytes y se
incrementa para cada intento de inserción. Esta clave no
aparece en la salida de SHOW CREATE TABLE
o DESCRIBE
.
La PRIMARY KEY
es más rápida que
cualquier otro índice, ya que la PRIMARY
KEY
se almacena junto con los datos. Los otros
índices se almacenan como los datos claves + la
PRIMARY KEY
, por lo que es importante
mantener la PRIMARY KEY
tan pequeña como
sea posible para ahorrar espacio en disco y tener más
velocidad.
Este comportamiento es similar al de
InnoDB
, donde las claves primarias
pequeñas ahorran espacio no sólo en el índice primario
sino también en índices secundarios.
Si todas las columnas a las que accede en una tabla
BDB
son parte del mismo índice o parte
de la clave primaria, MySQL puede ejcutar la consulta sin
tener que acceder al registro. En una tabla
MyISAM
, esto sólo puede hacerse si las
columnas son parte del mismo índice.
El escaneo secuencial es más lento que para tablas
MyISAM
ya que los datos en tablas
BDB
se almacena en B-trees y no en un
fichero de datos separado.
Los valores clave no tienen compresión de prefijo ni sufijo
como los valores clave en tablas MyISAM
.
En otras palabras, la información clave ocupa más espacio
en tablas BDB
en comparación con
MyISAM
.
A menudo hay huecos en la tabla BDB
que
le permiten insertar nuevos registros en medio del árbol
índice. Esto hace que las tablas BDB
sean algo más grandes que las MyISAM
.
SELECT COUNT(*) FROM
es lento para
tablas tbl_name
BDB
, ya que no se mantiene conteo
de registros en la tabla.
El optimizador necesita saber el número aproximado de
registros en la tabla. MySQL resuelve esto contando
inerciones y manteniendo esto en un segmento separado en
cada tabla BDB
. Si no realiza muchos
comandos DELETE
o
ROLLBACK
, este número debe ser lo
bastante adecuado para el optimizador MySQL . Sin embargo,
MySQL almacena el número sólo al cerrar, así que puede
ser incorrecto si el servidor termina inesperadamente. Puede
que no sea fatal incluso si este número no es 100%
correcto. Puede actualizar el contador de registros usando
ANALYZE TABLE
o OPTIMIZE
TABLE
. Consulte Sección 13.5.2.1, “Sintaxis de ANALYZE TABLE
” y
Sección 13.5.2.5, “Sintaxis de OPTIMIZE TABLE
”.
Bloqueo interno en tablas BDB
se realiza
a nivel de páginas.
LOCK TABLES
funciona en tablas
BDB
como con otras tablas. Si no usa
LOCK TABLES
, MySQL realiza un bloqueo
interno de múltiple escritura en la tabla (un bloqueo que
no bloquea otros escritores) para asegurar que la tabla
está bloqueada apropiadamente si otro flujo realiza un
bloqueo de tabla.
Para poder deshacer transacciones, el motor de
almacenamiento BDB
mantiene ficheros de
log. Para máximo rendimiento puede usar la opción
--bdb-logdir
para guardar los logs
BDB
en un disco distinto al que tiene las
bases de datos.
MySQL realiza un checkpoint cada vez que se comienza un
nuevo fichero log BDB
, y borra cualquier
fichero de log BDB
no necesario para
transacciones actuales. Puede usar FLUSH
LOGS
en cualquier momento para hacer un checkpoint
de tablas Berkeley DB.
Para recuperación de desastres, debe usar copias de seguridad de tablas más el log binario de MySQL. Consulte Sección 5.8.1, “Copias de seguridad de bases de datos”.
Atención: Si borra
ficheros de log antiguos que estén en uso,
BDB
no es capaz de recuperar todo y puede
perder datos si algo no va bien.
Las aplicaciones deben estar siempre preparadas para tratar
casos donde cualquier cambio en una tabla
BDB
pueda causar un rollback automático
y cualquier lectura puede fallar con un error de deadlock.
Si obtiene un disco entero con una tabla
BDB
, obtiene un error (probablemente
error 28) y la transacción debe deshacerse. Esto contrasta
con tablas MyISAM
en las que
mysqld espera a tener más espacio libre
para continuar.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.