Qué tan grande puede ser una base de datos MySQL antes de que el rendimiento comience a degradarse


¿En qué momento una base de datos MySQL comienza a perder rendimiento?

  • ¿Importa el tamaño físico de la base de datos?
  • ¿Importa el número de registros?
  • ¿Cualquier degradación del rendimiento es lineal o exponencial?

Tengo lo que creo que es una gran base de datos, con aproximadamente 15 millones de registros que ocupan casi 2 GB. Basado en estos números, ¿hay algún incentivo para que limpie los datos, o estoy seguro de permitir que continúe escalando por unos años más?

Author: davejal, 2008-08-04

13 answers

El tamaño físico de la base de datos no importa. El número de registros no importa.

En mi experiencia, el mayor problema que va a encontrar no es el tamaño, sino el número de consultas que puede manejar a la vez. Lo más probable es que tenga que pasar a una configuración maestro/esclavo para que las consultas de lectura puedan ejecutarse contra los esclavos y las consultas de escritura se ejecuten contra el maestro. Sin embargo, si aún no está listo para esto, siempre puede ajustar sus índices para las consultas estás corriendo para acelerar los tiempos de respuesta. También hay muchos ajustes que puede hacer a la pila de red y al núcleo en Linux que le ayudarán.

He tenido el mío hasta 10 GB, con solo un número moderado de conexiones y manejó las solicitudes muy bien.

Primero me centraría en sus índices, luego un administrador del servidor miraría su sistema operativo, y si todo eso no ayuda, podría ser el momento de implementar una configuración maestro/esclavo.

 176
Author: Nick Berardi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-31 17:55:32

En general, este es un tema muy sutil y no trivial en absoluto. Te animo a leer mysqlperformanceblog.com y MySQL de alto rendimiento. Realmente creo que no hay una respuesta general para esto.

Estoy trabajando en un proyecto que tiene una base de datos MySQL con casi 1 TB de datos. El factor de escalabilidad más importante es la RAM. Si los índices de sus tablas encajan en la memoria y sus consultas están altamente optimizadas, puede servir una cantidad razonable de solicitudes con un máquina promedio.

El número de registros importa, dependiendo de cómo se vean sus tablas. Es una diferencia tener muchos campos varchar o solo un par de ints o longs.

El tamaño físico de la base de datos también importa: piense en las copias de seguridad, por ejemplo. Dependiendo de su motor, sus archivos de base de datos físicos crecen, pero no se reducen, por ejemplo con innodb. Por lo tanto, eliminar muchas filas no ayuda a reducir sus archivos físicos.

Hay mucho en este tema y como en muchos casos el diablo está en los detalles.

 74
Author: dlinsin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-12 04:23:30

El tamaño de la base de datos sí importa. Si tiene más de una tabla con más de un millón de registros, el rendimiento comienza a degradarse. El número de registros por supuesto afecta el rendimiento: MySQL puede ser lento con tablas grandes. Si alcanza un millón de registros, obtendrá problemas de rendimiento si los índices no se establecen correctamente (por ejemplo, no hay índices para los campos en "WHERE statements" o "ON conditions" en joins). Si usted golpea 10 millones de registros, usted comenzará a obtenga problemas de rendimiento incluso si tiene todos sus índices correctos. Las actualizaciones de hardware-añadiendo más memoria y más potencia de procesador, especialmente memoria-a menudo ayudan a reducir los problemas más graves al aumentar el rendimiento de nuevo, al menos hasta cierto punto. Por ejemplo 37 señales pasaron de 32 GB de RAM a 128 GB de RAM para el servidor de base de datos Basecamp.

 36
Author: 0x4a6f4672,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-25 13:55:43

Me centraría primero en sus índices, que un administrador del servidor mire su sistema operativo, y si todo eso no ayuda, podría ser el momento de una configuración maestro/esclavo.

Eso es cierto. Otra cosa que generalmente funciona es reducir la cantidad de datos con los que se ha trabajado repetidamente. Si tiene "datos antiguos" y "datos nuevos" y el 99% de sus consultas funcionan con datos nuevos, simplemente mueva todos los datos antiguos a otra tabla, y no los mire;)

- > Echa un vistazo a particionamiento.

 22
Author: BlaM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-15 14:34:05

2GB y alrededor de 15M registros es una base de datos muy pequeña - He ejecutado mucho más grandes en un pentium III (!) y todo ha funcionado bastante rápido.. Si el suyo es lento es un problema de diseño de base de datos/aplicación, no uno de mysql.

 19
Author: ian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-05 09:03:48

No tiene sentido hablar de "rendimiento de la base de datos", "rendimiento de la consulta" es un término mejor aquí. Y la respuesta es: depende de la consulta, los datos sobre los que opera, los índices, el hardware, etc. Puede tener una idea de cuántas filas se van a escanear y qué índices se van a usar con la sintaxis de EXPLICACIÓN.

2GB realmente no cuenta como una base de datos "grande" - es más de un tamaño mediano.

 17
Author: deadprogrammer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-06 19:53:54

También tenga cuidado con las uniones complejas. La complejidad de las transacciones puede ser un factor importante además del volumen de transacciones.

Refactorizar consultas pesadas a veces ofrece un gran aumento del rendimiento.

 9
Author: saint_groceon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-04 19:01:23

Una vez me llamaron para ver un mysql que había "dejado de funcionar". Descubrí que los archivos DB residían en un dispositivo de red filer montado con NFS2 y con un tamaño máximo de archivo de 2 GB. Y por supuesto, la tabla que había dejado de aceptar transacciones era exactamente de 2 GB en disco. Pero con respecto a la curva de rendimiento me han dicho que estaba funcionando como un campeón hasta que no funcionó en absoluto! Esta experiencia siempre me sirve como un buen recordatorio de que hay siempre dimensiones por encima y por debajo de la que usted sospecha naturalmente.

 9
Author: jj33,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-06 04:27:52

Un punto a considerar es también el propósito del sistema y los datos en el día a día.

Por ejemplo, para un sistema con monitoreo GPS de automóviles no es relevante consultar datos de las posiciones del automóvil en meses anteriores.

Por lo tanto, los datos se pueden pasar a otras tablas históricas para una posible consulta y reducir los tiempos de ejecución de las consultas diarias.

 9
Author: alditis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-06 05:13:30

Actualmente estoy administrando una base de datos MySQL en la infraestructura de nube de Amazon que ha crecido a 160 GB. El rendimiento de la consulta está bien. Lo que se ha convertido en una pesadilla son las copias de seguridad, las restauraciones, la adición de esclavos o cualquier otra cosa que se ocupe de todo el conjunto de datos, o incluso DDL en tablas grandes. Obtener una importación limpia de un archivo de volcado se ha vuelto problemático. Con el fin de hacer que el proceso sea lo suficientemente estable como para automatizar, se necesitaban varias opciones para priorizar la estabilidad sobre el rendimiento. Si alguna vez tuviéramos que recuperarnos de un desastre usando una copia de seguridad SQL, estaríamos fuera de servicio durante días.

Escalar horizontalmente SQL también es bastante doloroso, y en la mayoría de los casos conduce a usarlo de maneras que probablemente no pretendía cuando eligió poner sus datos en SQL en primer lugar. Shards, read slaves, multi-master, etc., son soluciones realmente de mierda que agregan complejidad a todo lo que haces con la base de datos, y ninguna de ellas resuelve el problema; solo lo mitiga de alguna manera. Yo sugeriría fuertemente mirando a mover algunos de sus datos fuera de MySQL (o realmente cualquier SQL) cuando comienza a acercarse a un conjunto de datos de un tamaño donde este tipo de cosas se convierten en un problema.

 6
Author: Rich Remer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-30 16:32:58

El rendimiento puede degradarse en unos pocos miles de filas si la base de datos no está diseñada correctamente.

Si tiene índices adecuados, use motores adecuados (no use MyISAM donde se esperan múltiples DMLs), use particionado, asigne la memoria correcta dependiendo del uso y, por supuesto, tenga una buena configuración del servidor, ¡MySQL puede manejar datos incluso en terabytes!

Siempre hay maneras de mejorar el rendimiento de la base de datos.

 4
Author: Abhijit Buchake,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-19 11:26:31

Depende de su consulta y validación.

Por ejemplo, trabajé con una tabla de 100 000 medicamentos que tiene un nombre genérico de columna donde tiene más de 15 caracteres para cada medicamento en esa tabla .Puse una consulta para comparar el nombre genérico de los medicamentos entre dos tablas.La consulta tarda más minutos en ejecutarse.Lo mismo,si compara los medicamentos utilizando el índice de medicamentos,utilizando una columna de identificación (como se dijo anteriormente), solo toma unos segundos.

 3
Author: Anands23,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-03 11:55:19

El tamaño de la base de datos IMPORTA en términos de bytes y el número de filas de la tabla. Notará una gran diferencia de rendimiento entre una base de datos ligera y una llena de blob. Una vez que mi aplicación se atascó porque puse imágenes binarias dentro de los campos en lugar de mantener las imágenes en archivos en el disco y poner solo nombres de archivos en la base de datos. Iterar un gran número de filas, por otro lado, no es gratis.

 2
Author: Viktor Joras,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-05 10:27:47