Número máximo de registros en una tabla de base de datos MySQL

174

¿Cuál es el límite superior de registros para la tabla de base de datos MySQL? Me pregunto sobre el campo de autoincremento. ¿Qué pasaría si agrego millones de registros? ¿Cómo manejar este tipo de situaciones? ¡Gracias!

xpepermint
fuente
16
¡Sin mencionar los 1.21 GIGAWATTS!
Ben
2
Al menos si la memoria funciona, el motor de almacenamiento establece el límite, por lo que (por ejemplo) al usar MyISAM obtendrá un límite diferente al usar InnoDB.
Jerry Coffin
77
@ Onion-Knight: no estoy de acuerdo. Es normal insertar millones de filas en una sola tabla, y algunas bases de datos tienen un límite, por lo que vale la pena preguntar. Si uno pregunta si MySQL admite millones de tablas , probablemente sea un signo de un error arquitectónico.
Bill Karwin el

Respuestas:

61

Los tipos mysql int pueden hacer bastantes filas: http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html

el intvalor más grande sin 4,294,967,295
signo es el valor más grande sin signo bigintes18,446,744,073,709,551,615

KM.
fuente
8
2147483647 max, por lo que solo tiene que hacer un aumento automático si está trabajando con miles de millones de entradas. (lo que probablemente haría que sus declaraciones selectas se derritieran mucho antes)
Kzqai
2
@Tchalvak es para int firmado, lea la documentación de mysql.
Leandro
8
El contexto de la pregunta es sobre si el campo de incremento automático puede manejar muchas filas, y no las limitaciones de otros recursos
KM.
21
El póster no pregunta acerca de los tipos de datos numéricos u otros. . Realmente no entiendo cómo esto se puede marcar como una respuesta correcta. Aunque debo admitir que la pregunta es ambigua, debemos distinguir entre el tipo de datos PK y el número máximo de filas para una tabla.
Bery
1
@Bery, el OP ha distinguido lo que buscaban seleccionando esto como su respuesta. Aparentemente, estaban interesados ​​en la capacidad del campo de incremento automático, que cubre mi respuesta, y no en las limitaciones de otros recursos.
KM.
238

El mayor valor de un entero tiene poco que ver con el número máximo de filas que puede almacenar en una tabla.

Es cierto que si usa un int o bigint como clave principal, solo puede tener tantas filas como el número de valores únicos en el tipo de datos de su clave primaria, pero no tiene que hacer que su clave primaria sea un número entero , podrías convertirlo en un CHAR (100). También puede declarar la clave principal en más de una columna.

Hay otras restricciones en el tamaño de la tabla además del número de filas. Por ejemplo, podría usar un sistema operativo que tenga una limitación de tamaño de archivo. O podría tener un disco duro de 300 GB que puede almacenar solo 300 millones de filas si cada fila tiene un tamaño de 1 KB.

Los límites del tamaño de la base de datos son realmente altos:

http://dev.mysql.com/doc/refman/5.1/en/source-configuration-options.html

El motor de almacenamiento MyISAM admite 2 32 filas por tabla, pero puede construir MySQL con la --with-big-tablesopción de hacer que admita hasta 2 64 filas por tabla.

http://dev.mysql.com/doc/refman/5.1/en/innodb-restrictions.html

El motor de almacenamiento InnoDB no parece tener un límite en el número de filas, pero tiene un límite en el tamaño de la tabla de 64 terabytes. La cantidad de filas que se ajustan a esto depende del tamaño de cada fila.

Bill Karwin
fuente
62
basura - desearía haber leído esto antes ... ¡acabo de superar mi tamaño de 64 terrabytes en una de mis mesas y ahora mi sistema es muy lento!
JM4
2 ^ 32 = 4,294,967,295 y 2 ^ 64 = 18,446,744,073,709,551,615 así que ... El mayor valor entero tiene algo que ver con el número máximo de filas. No necesariamente la clave principal.
teynon
1
@Tom, InnoDB es el motor de almacenamiento predeterminado en MySQL 5.5, y es la mejor opción en el 99% de los casos.
Bill Karwin
2
@ Ext3h, Sphinx Search suele ser una mejor opción que los índices de texto completo en MyISAM o InnoDB.
Bill Karwin
1
Para mysql 8, el límite es de 256 TB con un tamaño de página de 64 KB.
UselesssCat
13

Sugiero, nunca borre datos. No diga si las tablas son más largas que 1000 truncar el final de la tabla. Es necesario que haya una lógica comercial real en su plan, como cuánto tiempo ha estado inactivo este usuario. Por ejemplo, si es más de 1 año, póngalos en una tabla diferente. Esto sucedería semanalmente o mensualmente en un script de mantenimiento en medio de un tiempo lento.

Cuando se encuentre con muchas filas en su tabla, entonces debería comenzar a dividir las tablas o particionar y colocar datos antiguos en tablas antiguas por año, como users_2011_jan, users_2011_feb o usar números para el mes. Luego cambie su programación para trabajar con este modelo. Tal vez haga una nueva tabla con menos información para resumir los datos en menos columnas y luego solo consulte las tablas particionadas más grandes cuando necesite más información, como cuando el usuario está viendo su perfil. Todo esto debe considerarse con mucho cuidado para que en el futuro no sea demasiado costoso re-factorizar. También puede poner solo los usuarios que vienen a su sitio todo el tiempo en una tabla y los usuarios que nunca vienen en un conjunto archivado de tablas.

PHPGuru
fuente
1
En este sentido, es muy útil mirar el particionamiento de MySQL: dev.mysql.com/doc/refman/5.6/en/partitions.html
Wim Deblauwe
10

En InnoDB, con un límite en el tamaño de la tabla de 64 terabytes y un límite de tamaño de fila de MySQL de 65,535, puede haber 1,073,741,824 filas. Esa sería una cantidad mínima de registros que utilizan el límite máximo de tamaño de fila. Sin embargo, se pueden agregar más registros si el tamaño de la fila es menor.

Xylo
fuente
para almacenar tantas filas (1,073,741,824) con un límite de filas de 65535, ¿cuánto tamaño de disco duro se requiere? por favor sugiera
davidb
1
El tamaño del disco duro requerido no se puede determinar según el número de filas y el tamaño de fila solo. El tamaño de la tabla en sí será de 64 terabytes. Sin embargo, los datos de las columnas TEXT y BLOB se almacenan por separado de la fila y necesitarán espacio adicional. Además, dependerá del número y tipo de las columnas TEXTO y BLOB, ya que el tamaño varía según el tipo. Hay cuatro tipos de columnas de TEXTO: TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT. También hay cuatro tipos de columnas BLOB, a saber, TINYBLOB, MEDIUMBLOB, BLOB y LONGBLOB.
Xylo
2

De acuerdo con la sección Escalabilidad y límites en http://dev.mysql.com/doc/refman/5.6/en/features.html , soporte MySQL para grandes bases de datos. Usan MySQL Server con bases de datos que contienen 50 millones de registros. Algunos usuarios usan MySQL Server con 200,000 tablas y aproximadamente 5,000,000,000 de filas.

Datos
fuente
que podría ayudar si también nos deja saber qué clase de hardware "Ellos" estaban usando
mi account_ram
De hecho, tienes razón. Pero desafortunadamente 'ellos' no hicieron nada sobre el hardware
Datos
@myaccount_ram lamento no cumplir esto, pero si es útil, he visto los límites menos teóricos y más prácticos de MySQL de producción en acción. He visto una base de datos que tiene ~ 18 mil millones de filas en 2x db.r4.16xlarge instancias de AWS (1 lector, 1 escritor). Cada una de las máquinas tenía 64 núcleos de CPU, 488 GB de RAM, enlace de red de 25 Gbps, 64 TB de disco. Esta escala de db estaba empujando los límites de tamaño de la CPU y del disco y AWS no proporciona ninguna instancia optimizada de DB más grande. Fue reemplazado por un esquema db más simple que no requería tantas filas.
Skylar Brown
1

Límites de tamaño de fila

The maximum row size for a given table is determined by several factors:
  • La representación interna de una tabla MySQL tiene un límite máximo de tamaño de fila de 65.535 bytes, incluso si el motor de almacenamiento es capaz de admitir filas más grandes. Las columnas BLOB y TEXT solo contribuyen de 9 a 12 bytes hacia el límite de tamaño de fila porque sus contenidos se almacenan por separado del resto de la fila.

  • El tamaño máximo de fila para una tabla InnoDB, que se aplica a los datos almacenados localmente dentro de una página de base de datos, es un poco menos de media página. Por ejemplo, el tamaño máximo de fila es ligeramente inferior a 8 KB para el tamaño predeterminado de página InnoDB de 16 KB, que se define mediante la opción de configuración innodb_page_size. " Límites en las tablas de InnoDB ".

  • Si una fila que contiene columnas de longitud variable excede el tamaño máximo de fila de InnoDB, InnoDB selecciona columnas de longitud variable para almacenamiento externo fuera de la página hasta que la fila se ajuste al límite de tamaño de fila de InnoDB. La cantidad de datos almacenados localmente para columnas de longitud variable que se almacenan fuera de la página difiere según el formato de fila. Para obtener más información, consulte " Almacenamiento de filas InnoDB y formatos de filas ".
  • Los diferentes formatos de almacenamiento utilizan diferentes cantidades de encabezado de página y datos de avance, lo que afecta la cantidad de almacenamiento disponible para las filas.
Saurabh Chandra Patel
fuente
1

Enlace http://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html

Límites de tamaño de fila

El tamaño máximo de fila para una tabla dada está determinado por varios factores:

La representación interna de una tabla MySQL tiene un límite máximo de tamaño de fila de 65.535 bytes, incluso si el motor de almacenamiento es capaz de admitir filas más grandes. Las columnas BLOB y TEXT solo contribuyen de 9 a 12 bytes hacia el límite de tamaño de fila porque sus contenidos se almacenan por separado del resto de la fila.

El tamaño máximo de fila para una tabla InnoDB, que se aplica a los datos almacenados localmente dentro de una página de base de datos, es un poco menos de media página para configuraciones de 4 KB, 8 KB, 16 KB y 32 KB innodb_page_size. Por ejemplo, el tamaño máximo de fila es ligeramente inferior a 8 KB para el tamaño de página InnoDB predeterminado de 16 KB. Para páginas de 64 KB, el tamaño máximo de fila es ligeramente inferior a 16 KB. Consulte la Sección 15.8.8, “Límites en las tablas de InnoDB”.

Si una fila que contiene columnas de longitud variable excede el tamaño máximo de fila de InnoDB, InnoDB selecciona columnas de longitud variable para almacenamiento externo fuera de la página hasta que la fila se ajuste al límite de tamaño de fila de InnoDB. La cantidad de datos almacenados localmente para columnas de longitud variable que se almacenan fuera de la página difiere según el formato de fila. Para obtener más información, consulte la Sección 15.11, "InnoDB Row Storage and Row Formats".

Los diferentes formatos de almacenamiento utilizan diferentes cantidades de encabezado de página y datos de avance, lo que afecta la cantidad de almacenamiento disponible para las filas.

Para obtener información sobre los formatos de fila de InnoDB, consulte la Sección 15.11, “Almacenamiento de filas y formatos de fila de InnoDB”, y la Sección 15.8.3, “Estructura de filas físicas de las tablas de InnoDB”.

Para obtener información sobre los formatos de almacenamiento MyISAM, consulte la Sección 16.2.3, “Formatos de almacenamiento de tablas MyISAM”.

http://dev.mysql.com/doc/refman/5.7/en/innodb-restrictions.html

Md Nazrul Islam
fuente
-3

No hay límite. Solo depende de la memoria libre y del tamaño máximo de archivo del sistema. Pero eso no significa que no deba tomar medidas de precaución al abordar el uso de memoria en su base de datos. Siempre cree un script que pueda eliminar filas que están fuera de uso o que mantendrán el total de filas dentro de una figura en particular, digamos mil.

9jamkt
fuente
8
Eliminar filas que cree que están 'fuera de uso' es peligroso y causa muchos más problemas de los que resuelve. Un desarrollador anterior de uno de mis proyectos implementó un script que eliminó los carritos de compras de más de tres días de antigüedad, pensando que estaba haciendo lo correcto. Adivina qué, causa problemas semanalmente. Solo elimine datos si realmente lo necesita.
Ben Hitchcock
un peor caso es cuando alguien comienza a almacenar las rutas de los archivos en una base de datos ... hay dónde se fueron todos mis archivos de proyecto ... tengo un pequeño proyecto que comienza en 3.5M, adivina qué ... no son todos Utilizado con frecuencia.
Kendrick