¿Cuántas filas en una base de datos son DEMASIADAS?

87

Tengo una tabla MySQL InnoDB con 1,000,000 de registros. ¿Es esto demasiado? ¿O las bases de datos pueden manejar esto y más? Pregunto porque noté que algunas consultas (por ejemplo, obtener la última fila de una tabla) son más lentas (segundos) en la tabla con 1 millón de filas que en una con 100.

Juanjo Conti
fuente

Respuestas:

114

Tengo una tabla MySQL InnoDB con 1000000 registros. ¿Es esto demasiado?

No, 1,000,000 de filas (registros AKA) no es demasiado para una base de datos.

Pregunto porque noté que algunas consultas (por ejemplo, obtener el último registro de una tabla) son más lentas (segundos) en la tabla con 1 millón de registros que en una con 100.

Hay mucho que tener en cuenta en esa declaración. Los sospechosos habituales son:

  1. Consulta mal escrita
  2. No usar una clave principal, suponiendo que exista una en la mesa
  3. Modelo de datos mal diseñado (estructura de tabla)
  4. Falta de índices
Ponis dios mio
fuente
4
5. Especificaciones de servidor obsoletas <Último recurso.
Furtividad
19
@Brimstedt: Siempre pensé que el sustantivo debería ser "Índices", pero no creo haber visto a nadie usándolo para bases de datos: desde Wikipedia: en.wikipedia.org/w/… hasta Mr. Coding Horror: codinghorror. com / blog / archives / 000638.html . Hay esta interesante publicación de SO sobre el tema: stackoverflow.com/questions/1001366 .
Daniel Vassallo
7
6. no hay suficiente memoria asignada para los distintos cachés de innodb
Jason
para un mejor rendimiento, ¿debo usar PrimaryKey? ¿Qué hay de usar otras claves como Index, Unique? ¿Puedo usar estos? Gracias
user1844933
Tal vez la computadora está llena de memoria como dijo Jason y se corta en medio del proceso
ytpillai
67

Tengo una base de datos con más de 97.000.000 de registros ( archivo de datos de 30GB ) y no tengo ningún problema.

Solo recuerde definir y mejorar el índice de su tabla .

¡Entonces es obvio que 1,000,000 no son MUCHOS! (Pero si no indexa; sí, son MUCHOS)

amir beygi
fuente
10
¿Agregar una "clave principal" a una columna (al seleccionar el incremento automático) sería indexación?
Nathan
8
@Nathan, en realidad, cuando asigna una columna para que sea una clave principal, se indexa automáticamente, pero cada tabla puede tener solo una clave principal, si necesita agregar un índice para alguna columna, para optimizar las consultas, use este stackoverflow.com/ a / 3002635/932473
dav
Tengo una mesa con un billón pero la selección de datos en formato IN LIFO es lenta.
Saurabh Chandra Patel
Defina no tener problemas. ¿Cuánto tarda la consulta más compleja? Tenemos una tabla con 100 millones de filas y un cliente espera que las consultas se realicen en un máximo de 5 segundos, independientemente de los criterios de agrupación u orden que utilice. Nuestros índices podrían mejorarse, pero antes de que bloqueemos todo, intente agregar un índice
Joe Yahchouchi
El 20% de las mesas de producción (según un estudio anterior) tienen más de 1 millón de filas. He visto algunos con varios miles de millones de filas.
Rick James
19

Utilice 'explicar' para examinar su consulta y ver si hay algún problema con el plan de consulta.

Programador Journeyman
fuente
6
Si bien es una buena idea, esta respuesta en sí no es buena para dársela a un novato. La salida de EXPLAIN no es muy intuitiva ...
nickf
17
No hay otra herramienta que le ayude a examinar las consultas, así que es mejor empezar a aprender EXPLAIN, sean novatos o no.
nos
30
Sería bueno si alguien pudiera EXPLICAR EXPLAIN ;)
Jo E.
7
@Deadpool Mysql Explicación explicada
Sithsu
15

Creo que este es un error común: el tamaño es solo una parte de la ecuación cuando se trata de la escalabilidad de la base de datos. Hay otros problemas que son difíciles (o más difíciles):

  • Qué tan grande es el conjunto de trabajo (es decir, cuántos datos deben cargarse en la memoria y trabajar activamente). Si simplemente inserta datos y luego no hace nada con ellos, en realidad es un problema fácil de resolver.

  • ¿Qué nivel de concurrencia se requiere? ¿Hay un solo usuario insertando / leyendo, o tenemos muchos miles de clientes operando a la vez?

  • ¿Qué niveles de promesa / durabilidad y consistencia de desempeño se requieren? ¿Tenemos que asegurarnos de poder cumplir con cada compromiso? ¿Está bien si la transacción promedio es rápida, o queremos asegurarnos de que todas las transacciones sean confiablemente rápidas (control de calidad de seis sigma como - http://www.mysqlperformanceblog.com/2010/06/07/performance-optimization- y-seis-sigma / ).

  • ¿Necesita hacer algún problema operativo, como ALTERAR el esquema de la tabla? En InnoDB esto es posible, pero increíblemente lento, ya que a menudo tiene que crear una tabla temporal en primer plano (bloqueando todas las conexiones).

Así que voy a decir que las dos cuestiones limitantes serán:

  • Su propia habilidad para escribir consultas / tener buenos índices.
  • Cuánto dolor puede tolerar esperando las declaraciones ALTER TABLE.
Morgan Tocker
fuente
2
Editar: Los consejos sobre la creación de tablas temporales en ALTER TABLE están un poco anticuados. MySQL 5.5 tiene una creación de índice rápida y 5.6 ahora tiene DDL en línea.
Morgan Tocker
3

Si se refiere a 1 millón de filas, depende de cómo se realice la indexación y de la configuración de su hardware. Un millón de filas no es una gran cantidad para una base de datos empresarial, o incluso una base de datos de desarrollo en un equipo decente.

si te refieres a 1 millón de columnas (no estoy seguro de que eso sea posible en MySQL) entonces sí, esto parece un poco grande y probablemente causará problemas.

GrayWizardx
fuente
3

¿Registrarse? ¿Te refieres a grabar?

Un millón de registros no es un gran problema para una base de datos en estos días. Si tiene algún problema, es probable que no sea el sistema de base de datos en sí, sino el hardware en el que lo está ejecutando. Lo más probable es que no tenga ningún problema con la base de datos antes de que se quede sin hardware para solucionarlo.

Ahora, obviamente, algunas consultas son más lentas que otras, pero si dos consultas muy similares se ejecutan en tiempos muy diferentes, debe averiguar cuál es el plan de ejecución de la base de datos y optimizarlo, es decir, usar índices correctos, normalización adecuada, etc.

Por cierto, no existe un "último" registro en una tabla, desde un punto de vista lógico, no tienen un orden inherente.

Febo
fuente
Me refiero a algo como "SELECT * FROM table ORDER BY id DESC LIMIT 0"
Juanjo Conti
4
Quizás necesites en SELECT LAST_INSERT_ID()lugar de esa consulta.
True Soft
3

He visto tablas no particionadas con varios miles de millones de registros (indexados), que se unen automáticamente para el trabajo analítico. Eventualmente dividimos la cosa pero honestamente no vimos mucha diferencia.

Dicho esto, eso fue en Oracle y no he probado ese volumen de datos en MySQL. Los índices son tus amigos :)

Jé Queue
fuente
2

Suponiendo que quiere decir "registros" por "registros", no, no es demasiado, MySQL se escala muy bien y puede contener tantos registros como tenga espacio en su disco duro.

Obviamente, aunque las consultas de búsqueda serán más lentas. Realmente no hay forma de evitar eso, excepto asegurarse de que los campos estén indexados correctamente.

Thomas Bonini
fuente
2
Técnicamente, el tamaño de la tabla también podría estar limitado por el tamaño máximo de archivo del sistema de archivos que está utilizando.
tster
0

Cuanto más grande se vuelve la tabla (como en más filas), las consultas más lentas se ejecutarán normalmente si no hay índices. Una vez que agregue los índices correctos, el rendimiento de su consulta debería mejorar o al menos no degradarse tanto a medida que crece la tabla. Sin embargo, si la consulta en sí devuelve más filas a medida que la tabla se hace más grande, comenzará a ver degradación nuevamente.

Si bien 1 millón de filas no son tantas, también depende de la cantidad de memoria que tenga en el servidor de base de datos. Si la tabla es demasiado grande para que el servidor la almacene en la memoria caché, las consultas serán más lentas.

jvilalta
fuente
0

El uso de la consulta proporcionada será excepcionalmente lento debido al uso de un método de combinación de ordenación para ordenar los datos.

Recomendaría repensar el diseño para que esté utilizando índices para recuperarlo o asegurarse de que ya esté ordenado de esa manera para que no sea necesario ordenarlo.

Luis
fuente