Si la utilidad top
de Unix o el
Administrador de Tareas de Windows muestra que el porcentaje
de uso de CPU durante la carga de trabajo es inferior al 70%,
probablemente se está trabajando directamente sobre el disco.
Podría suceder que se estén produciendo excesivas
confirmaciones de transacciones, o que el pool de buffer sea
muy pequeño. Puede ser de ayuda incrementar el tamaño del
buffer, pero no debe alcanzar ni superar el 80% del total de
la memoria física del ordenador.
Incluir varias modificaciones en una sola transacción.
InnoDB
debe descargar su registro (log) al
disco cada vez que se confirma una transacción, si dicha
transacción realiza modificaciones en la base de datos. Dado
que la velocidad de rotación de un disco es generalmente de
167 revoluciones por segundo, esto restringe el número de
confirmaciones a la misma fracción de segundo si el disco no
“engaña” al sistema operativo.
Si es aceptable la pérdida de alguna de las últimas
transacciones confirmadas, se puede establecer en
my.cnf
el parámetro
innodb_flush_log_at_trx_commit
a un valor
de 0. InnoDB
intenta descargar el registro
(log) una vez por segundo en cualquier caso, aunque la
descarga no está garantizada.
Incrementar el tamaño de los ficheros de registro (log),
incluso hasta equiparar el tamaño del pool de buffer. Cuando
InnoDB
ha colmado la capacidad de los
ficheros de log, debe escribir los contenidos modificados
desde el pool de buffer al disco en un punto de verificación.
Los ficheros de log pequeños pueden causar escrituras en
disco innecesarias. La desventaja de los ficheros de log
grandes es que la recuperación demanda más tiempo.
También el buffer del log debe ser suficientemente grande (en el orden de los 8MB).
Emplear el tipo de columna VARCHAR
en lugar
de CHAR
si se almacenarán cadenas de
longitud variable o si la columna contendrá muchos valores
NULL
. Una columna
CHAR(
siempre
utiliza N
)N
bytes para almacenar los
datos, inclusive si la cadena es más corta o es
NULL
. Las tablas más pequeñas aprovechan
mejor el espacio del pool de buffer y reducen las operaciones
de E/S en disco.
Cuando se utiliza row_format=compact
(el
formato de registro predeterminado para InnoDB en MySQL 5.0) y
un conjunto de caracteres de longitud variable como
utf8
o sjis
,
CHAR(
ocupará
una cantidad variable de espacio, con un mínimo de
N
)N
bytes.
En algunas versiones de GNU/Linux y Unix, descargar ficheros a
disco con la función de Unix fsync()
(la
cual es utilizada en forma predeterminada por
InnoDB
) y otros métodos similares, es
sorprendentemente lento. Si no se está satisfecho con el
rendimiento de las operaciones de escritura de la base de
datos, se puede intentar establecer el valor de
innodb_flush_method
en
my.cnf
a O_DSYNC
, si
bien O_DSYNC
parece ser más lento en otros
sistemas.
Durante el empleo del motor de almacenamiento InnoDB en
arquitecturas Solaris 10 para x86_64 (AMD Opteron), es
importante usar la opción forcedirectio
al
montar cualquier sistema de ficheros usado para almacenar los
ficheros relacionados con InnoDB (el comportamiento
predeterminado en Solaris 10/x86_64 es no
utilizar esta opción al montar el sistema de ficheros). Si no
se utiliza forcedirectio
se producirá una
seria degradación en la velocidad y rendimiento de InnoDB en
esta plataforma.
Al importar datos dentro de InnoDB
, hay que
asegurarse de que MySQL no tiene habilitado el modo de
ejecución automática (autocommit) porque provocaría una
descarga del log a disco en cada inserción. Para desactivar
la ejecución automática durante la operación de
importación, hay que encerrarla entre sentencias SET
AUTOCOMMIT
y COMMIT
:
SET AUTOCOMMIT=0; /* Sentencias de importación SQL ... */ COMMIT;
Si se utiliza la opción --opt
con
mysqldump, se obtienen ficheros de voclado
que son rápidos de importar en una tabla
InnoDB
, incluso sin encerrarlos en las
sentencias SET AUTOCOMMIT
y
COMMIT
.
Tener cuidado con las cancelaciones de inserciones masivas:
InnoDB
emplea el buffer de inserciones para
reducir la cantidad de operaciones de E/S en disco durante las
inserciones, pero ese mecanismo no tiene efecto en la
cancelación. Una cancelación efectuada directamente sobre el
disco puede tomar 30 veces el tiempo que insumen las
correspondientes inserciones. Matar el proceso del servidor de
bases de datos no es de ayuda, porque la cancelación
recomienza al volver a iniciar el servidor. La única forma de
librarse de una cancelación fuera de control es incrementar
el tamaño del pool de buffer para que la cancelación se haga
sobre la CPU y se ejecute más rápidamente, o utilizar un
procedimiento especial. Consulte
Sección 15.8.1, “Forzar una recuperación”.
También hay que tener cuidado con las operaciones de gran
tamaño realizadas directamente sobre el disco. Hay que
emplear DROP TABLE
y CREATE
TABLE
para obtener una tabla vacía, no
DELETE FROM
.
tbl_name
Emplear la sintaxis de múltiples filas de
INSERT
para reducir la carga extra de la
comunicación entre el cliente y el servidor si se necesita
insertar muchos registros:
INSERT INTO yourtable VALUES (1,2), (5,5), ...;
Esta sugerencia es válida para las inserciones en cualquier
tipo de tabla, no solamente en InnoDB
.
Si se tienen restricciones UNIQUE
en claves
secundarias, se puede acelerar la importación desactivando
temporalmente, durante la importación, la verificación de
tales restricciones:
SET UNIQUE_CHECKS=0;
En tablas grandes, esto ahorra una gran cantidad de
operaciones de E/S en disco debido a que
InnoDB
puede emplear su buffer de
inserción para escribir de una vez los registros de indice
secundarios.
Si se tienen restricciones FOREIGN KEY
en
las tablas, se puede acelerar la importación desactivando la
verificación de claves foráneas durante la misma:
SET FOREIGN_KEY_CHECKS=0;
Para tablas grandes, esto puede ahorrar gran cantidad de operaciones sobre el disco.
Si a menudo se realizan consultas sobre tablas que no se actualizan con frecuencia, utilizar el cache de consultas:
[mysqld] query_cache_type = ON query_cache_size = 10M
É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.