¿Base de datos Drupal innodb o MyISAM?

10

Tengo un sitio de Drupal y estoy sufriendo problemas de rendimiento. Encontré ¿Cómo convierto una base de datos de MyISAM a InnoDB? indicando que el rendimiento puede mejorar cambiando.

¿Cómo puedo saber si mi base de datos MySQL es InnoDB o MyISAM?

chrisjlee
fuente
1
El tipo de tabla no está vinculado al catálogo. Puede tener un catálogo con una mezcla de tablas MyISAM e InnoDB.
mpdonadio
2
Si bien hay optimizaciones en ese nivel, dudo mucho que cambiar los tipos de tabla solucione sus problemas de rendimiento. La diferencia no es tan grande.
Letharion
1
@ Chris J. Lee, eso es correcto. Los tipos de tablas de mezcla se pueden usar por razones de rendimiento o para explotar características que solo están disponibles para un tipo de tabla en particular (por ejemplo, búsqueda FULLTEXT con tablas MyISAM). También puede suceder por accidente si cambia los valores predeterminados de mysqld y crea más tablas en un catálogo :)
mpdonadio
2
Letharion: eso es simplemente incorrecto. ¡Los tipos de tablas y la forma en que mysql está configurado para ellos tienen un gran impacto en el rendimiento!
Walter Heck el
2
@Letharion: De hecho, dejando de lado las mejoras arquitectónicas, las ganancias de rendimiento muy grandes en el caso de cosas como la concurrencia con SELECTs y UPDATE mixtos, una UPDATE bloqueará una tabla en MyISAM, pero solo una fila en InnoDB, significa que grandes aumentos de rendimiento pueden ser visto con nada más que cambiar el motor de una mesa. Ahora, si está haciendo una consulta tonta, entonces está haciendo una consulta tonta, y cambiar los tipos de tabla no ayudará. Pero descartar el cambio de motores de la mano es igualmente incorrecto.
BMDan

Respuestas:

8

Puede ejecutar una consulta personalizada:

SELECT TABLE_NAME, ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'database_name'

para enumerar todas las tablas en su base de datos y el motor que está en uso para cada una.

Alternativamente, puede iniciar sesión en su base de datos usando phpMyAdmin y seleccionar su base de datos ... verá el motor en la Typecolumna en la lista de tablas.

Personalmente, recomendaría Navicat para MySQL , es una GUI MySQL muy agradable y hace que descubrir cosas como esta sea muy fácil.

Fuente: http://www.electrictoolbox.com/mysql-table-storage-engine/

Clive
fuente
La antigua herramienta de administrador MySQL también funciona bien para cosas como esta. Si hurgas en el sitio web de MySQL, aún puedes encontrar el instalador.
mpdonadio
@MPD Wow, ¿eso sigue funcionando? Debe descargar eso incluso si solo por un poco de nostalgia :)
Clive
El Administrador y el Navegador de consultas están oficialmente en desuso y no son compatibles ahora, pero aún puede descargarlos. Odio Workbench, y todavía los uso.
mpdonadio
Para ver resultados similares a los que vio en phpMyAdmin en la línea de comandos, use SHOW TABLE STATUS. Para obtener un recuento simple de cuántas tablas hay en cada tipo de motor, es SELECT ENGINE,COUNT(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA='database_name' GROUP BY ENGINE.
BMDan
6

Mi mejor experiencia fue decidir por mesa. InnoDB es bueno, porque puede evitar el bloqueo de la tabla (ningún otro proceso puede leer de una tabla mientras un proceso escribe), pero funciona terriblemente con COUNT (), que se usa a menudo para consultas de buscapersonas.

(Editar: consulte el comentario de Clives a continuación)

También hay implicaciones en su configuración de MySQL, dependiendo de la base de datos que esté utilizando. Si tiene acceso al servidor, mysqltuner debería ser su primer paso, para verificar la configuración:

https://github.com/rackerhacker/MySQLTuner-perl#readme

Martín
fuente
2
+1 No sabía que InnoDB era lento para las COUNTconsultas, de acuerdo con este artículo del ex gerente de High Performance Group para MySQL, aunque solo afecta realmente una consulta que contiene COUNT(*) sin una WHEREcláusula.
Clive
3
La razón es que MyISAM mantiene un valor por tabla para el número de filas en la tabla, lo que significa que un simple SELECT COUNT(*) FROM tablepuede regresar instantáneamente con ese valor. InnoDB no lo hace, por lo que debe escanear todo el índice de la clave primaria. Dicho esto, aunque Drupal hace mucho SELECT COUNT(*), solo puedo pensar en un lugar en el código completo que lo haga sin una WHEREcláusula. Por lo tanto, no use MyISAM por preocupación para este caso particular. InnoDB con un grupo de búferes de tamaño decente será más rápido para todas las consultas del mundo real.
BMDan
6

Simplemente intentar cosas para obtener un sitio web más rápido es como cambiar de automóvil a ciegas y esperar que la próxima vez sea más rápido.

Primero pruebe las frutas bajas, si no ayuda, trate de encontrar el verdadero cuello de botella.

  1. ¿Activaste los mecanismos integrados: almacenamiento en caché de páginas (solo efectivo para usuarios anónimos), CSS y agregación JS?
  2. Si su host ofrece un caché de código de operación como APC, actívelo.
  3. Configure su Drupal localmente, incluida la base de datos completa.
  4. Asegúrese de tener XDebug ejecutándose.
  5. Comience a hacer perfiles de rendimiento real. De esta manera, puede identificar qué parte de su sitio web consume mucho tiempo. Cuanto más lento sea su sitio web, más fácil será encontrar el código / componente culpable.

A menudo es solo una consulta de base de datos lenta que necesita un índice, o un módulo que haga las cosas de manera lenta.

También descubrí grandes diferencias entre los hosters. Si instala un nuevo drupal de fábrica, ¿está bien el rendimiento? Si no, es hora de buscar otro hoster.

BetaRide
fuente
5

FWIW nuestro sitio Drupal 6.x de casi 20K nodos estaba experimentando algunos problemas de rendimiento y decidí mover todas las tablas a InnoDB. Fue fácil y la forma en que lo manejé fue usar mysqldump para volcar todo el contenido en un archivo sql, usar un editor (sed) para reemplazar todas las apariciones de MyISAM en InnoDB y luego volver a cargar la base de datos desde ese archivo. Una de las desventajas es que no puede recuperar espacio de una base de datos InnoDB (IIRC), pero siempre que mantenga sus tablas duplicadas en una base de datos separada, no debería tener problemas. Ah, y vimos un aumento significativo en el rendimiento. Y debido a que tenemos cuatro instancias de Drupal, la gran cantidad de archivos de tabla se eliminó del sistema de archivos (sí, están contenidos dentro del propio archivo InnoDB). Este es mi valor de $ .02.

bobmct
fuente
2
Tener un solo espacio de tabla InnoDB puede ahorrarle inodos, pero (como usted mismo lo menciona) a expensas del espacio en disco. Incluso si elimina muchos datos, no podrá recuperar ese espacio en disco. Esto también da como resultado archivos de copia de seguridad grandes innecesarios y no poder restaurar tablas individuales. Por eso prefiero usar la innodb_file_per_tableopción.
geewiz
1
Además, puede convertir las tablas en el lugar: for tbl in $(mysql -Ne 'show tables' databasename); do mysql -e "ALTER TABLE $tbl ENGINE=InnoDB"; done. Agregue las opciones apropiadas ( -uroot -psomepasspor ejemplo) a los dos mysqls si es necesario.
BMDan
5

Solo un aviso. Si está en Drupal 6, puede instalar el módulo DBTuner ; puede mover fácilmente sus tablas de MyISAM a InnoDB. Entonces sí, ¡hay un módulo para eso!

mikeytown2
fuente