Si fuera usted, cambiaría todos los datos a InnoDB. El bloqueo de tabla / bloqueo de fila ha sido discutido por muchos durante mucho tiempo. Siempre elegiría InnoDB sin dudas. Sin embargo, hay otra razón profunda para elegir InnoDB ... CACHING .
Si bien la mayoría de las personas se jactan de que MyISAM es más rápido para las lecturas, la mayoría de las personas olvidan que la gran cantidad de caché para MyISAM, que se llama caché de claves (establecida por key_buffer_size), solo almacena en caché las páginas de índice de los archivos .MYI. Nunca almacena en caché las páginas de datos. Tiene un máximo oficial de 4 GB en sistemas de 32 bits. 8 GB es el mejor máximo para 64 bits.
El InnoDB Buffer Pool almacena en caché los datos y las páginas de índice. Dependiendo del servidor que tenga, puede almacenar en caché hasta el conjunto de datos completo en la RAM. Puede ajustar InnoDB para hasta un 80% de RAM y un 10% para las conexiones de base de datos, y dejar un 10% para el sistema operativo. Esto es cierto incluso para diferentes sistemas operativos .
He recomendado estas cosas para los clientes de Drupal con un éxito maravilloso. Se aplica a Wordpress también. He proporcionado soporte DB para clientes con WordPress. Las mismas mejoras.
Siempre puede configurar la memoria para InnoDB de manera más efectiva que con MyISAM. Siempre hay una manera de modificar InnoDB para satisfacer sus necesidades de rendimiento . A medida que crecen sus datos, eventualmente se convertirá en un requisito .
ACTUALIZACIÓN 2011-11-21 11:44 EST
Si su conjunto de datos completo es lo suficientemente pequeño, puede ejecutar una consulta SELECT en cada tabla que tenga justo después de que mysql se inicie.
Para todas las tablas que son InnoDB y / o MyISAM, ejecute esta consulta:
SELECT DISTINCT
CONCAT('SELECT ',ndxcollist,' FROM ',
db,'.',tb,' ORDER BY ',ndxcollist,';') SelectQueryToLoadCache
FROM (
SELECT
engine,table_schema db,table_name tb,index_name,
GROUP_CONCAT(column_name ORDER BY seq_in_index) ndxcollist
FROM (
SELECT
B.engine,A.table_schema,A.table_name,
A.index_name,A.column_name,A.seq_in_index
FROM
information_schema.statistics A INNER JOIN
(SELECT engine,table_schema,table_name
FROM information_schema.tables
WHERE engine IN ('InnoDB','MyISAM')) B
USING (table_schema,table_name)
WHERE
B.table_schema NOT IN ('information_schema','mysql')
AND A.index_type <> 'FULLTEXT'
ORDER BY
table_schema,table_name,index_name,seq_in_index
) A
GROUP BY
table_schema,table_name,index_name
) AA
ORDER BY
engine DESC,db,tb
;
Esto generará todas las consultas SELECT posibles que necesite ejecutar que convocarán todos los índices a los que se hará referencia. Coloque esta consulta en un archivo llamado /root/MakeSelectQueriesToLoad.sql. Ejecute el script y recopile la salida /root/SelectQueriesToLoad.sql. Finalmente, ejecútalo:
mysql -u... -p... -AN < /root/MakeSelectQueriesToLoad.sql > /root/SelectQueriesToLoad.sql
mysql -u... -p... < /root/SelectQueriesToLoad.sql
Esto definitivamente precargará todas las páginas de índice en el InnoDB Buffer Pool y MyISAM Key Cache. Si todos sus datos son InnoDB, realice dos cambios:
- reemplazar
WHERE engine IN ('InnoDB','MyISAM')
conWHERE engine='InnoDB'
- reemplazar
CONCAT('SELECT ',ndxcollist,' FROM ',
conCONCAT('SELECT * FROM ',
Esto también completará más páginas de datos en el InnoDB Buffer Pool.
NOTA FINAL: Asegúrese de que el InnoDB Buffer Pool sea lo suficientemente grande como para contener todos sus datos de InnoDB