¿Tener demasiadas tablas en una base de datos Mysql puede afectar el rendimiento?

10

¿Tener demasiadas tablas (200 por ejemplo) en una sola instancia de base de datos Mysql puede reducir su rendimiento?

usuario25704
fuente

Respuestas:

8

En general, cuanto más tenga, reducirá el rendimiento. Sin embargo, 200 parece un número bastante pequeño. 2,000 podría ser un verdadero éxito de rendimiento y definitivamente 20,000. Sin embargo, en general, debe mantener su número de tablas pequeño ya que MySQL puede manejar un número muy grande de filas en la tabla.

Topher Fangio
fuente
77
Un gran número de tablas puede marcar una gran diferencia si su aplicación utiliza 'información_esquema'. Nada en 'information_schema' se almacena en caché. Varios sistemas ORM diferentes hacen un uso intensivo de esto.
Zoredache
4

El número de tablas no importa tanto como:

  1. Qué consultas está ejecutando: es probable que no esté consultando las 200 dentro de una sola consulta
  2. La carga de consulta general en el sistema en cualquier momento dado

Tener tablas en exceso significa memoria y espacio en el disco duro que podría recuperarse y utilizarse para otras cosas. Tenga en cuenta que desnormalizar sus tablas aumenta el riesgo de datos incorrectos porque se está deshaciendo de la integridad referencial.

Ponis OMG
fuente
4

En general, 200 tablas no deberían ser un problema, pero depende de varias cosas.

Servidor MySQL dedicado vs Servidor compartido con otro software, 128Mb vs 128Gb RAM, etc., tablas pequeñas con pocos registros vs tablas con blobs y millones de filas.

MySQL tiene configuraciones múltiples y múltiples motores, cada uno de los cuales afecta el rendimiento de las tablas de diferentes maneras.

MyISAM normalmente tiene tres archivos por tabla .frm, .MYD, .MYI

INNODB en modo normal tiene .frm con todos los datos almacenados en el archivo central

INNODB en un archivo por modo de tabla tiene .frm, .idb

table_open_cache es el número de tablas que se pueden abrir a la vez (Predeterminado 64). Es posible que esto deba ser mayor que la cantidad de tablas en su esquema, ya que está relacionado con cuántas conexiones están consultando la base de datos. 100 conexiones unen 3 tablas podría significar que tiene 300 tablas en caché más cualquier tabla temporal. En general, un esquema o conexiones más complejas cuanto mayor sea el número.

open-files-limit Tiendo a establecer esto en 4x table_open_cache, que debería ser generoso en lugar de molestarse en calcular un valor exacto.

El límite de manejo de archivos del sistema operativo para el usuario de mysql también puede ser un problema (en Linux el valor predeterminado a menudo puede ser 1024, ulimit -n para mostrar los límites del usuario) esto puede causar un problema con un gran número de tablas cuando es menor que el número MySQL requiere. Esto debería ser al menos igual que el límite de archivos abiertos.

Como con cualquier base de datos, hay cientos de parámetros de ajuste que puede ajustar para optimizar la base de datos para su esquema particular. MySQL es peor para esto que la mayoría, ya que puede conectar motores adicionales si lo desea, es decir, motor de clúster NDB.

http://dev.mysql.com/doc/refman/5.1/en/table-cache.html

Espero eso ayude


fuente
2

Para el índice de cada tabla, MySQL tiene su propio índice. El índice requiere memoria para retener y usar, y hay un límite global para los índices. Cuando hay muchas tablas, los índices no pueden estar todos en la RAM, por lo que van al disco, lo que afecta el rendimiento directamente. Intente plantear esto en my.cnf: key_buffer_size=256Mesta es la cantidad de RAM reservada para mantener la información del índice.

Kolypto
fuente
1

¿Puede? Por supuesto. Pero cuánto depende en gran medida de su aplicación y sus patrones de acceso, y si está utilizando myisam o innodb, y si innodb está en modo de archivo por tabla o no, y el tamaño de los registros de innodb. Tendrá que darnos más detalles que eso.

Jim Zajkowski
fuente
1

No, no creo que el número de tablas sea el cuello de botella de rendimiento en su sistema. Después de todo, son solo archivos en su sistema de archivos. No hay nada inusual en tener cientos de tablas en una base de datos.

Mucho más probable es que sus consultas no estén correctamente optimizadas. Aconsejaría activar el log-slow-queriesy log-queries-not-using-indexes. Cuando identifique consultas lentas, use la explainopción para ver el plan de consulta de estas consultas para identificar los lugares donde faltan índices.

Consulte http://dev.mysql.com/doc/refman/5.0/en/slow-query-log.html para obtener más detalles.

codeinthehole
fuente