Número máximo de registros em uma tabela de banco de dados MySQL

174

Qual é o limite superior de registros para a tabela de banco de dados MySQL. Eu estou pensando sobre o campo de incremento automático. O que aconteceria se eu adicionar milhões de registros? Como lidar com esse tipo de situação? THX!

xpepermint
fonte
16
Sem mencionar os 1,21 GIGAWATTS!
26410 Ben
2
Pelo menos se a memória servir, o limite é definido pelo mecanismo de armazenamento; portanto, por exemplo, usando o MyISAM, você obtém um limite diferente do InnoDB.
22810 Jerry Coffin
77
@ Cavaleiro Cebola: Eu não concordo. É normal inserir milhões de linhas em uma única tabela, e alguns bancos de dados têm um limite, então vale a pena perguntar. Se alguém perguntar se o MySQL suporta milhões de tabelas , isso provavelmente é um sinal de um erro arquitetônico.
Bill Karwin

Respostas:

61

Os tipos mysql int podem fazer algumas linhas: http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html

unsigned intmaior valor é 4,294,967,295
assinado bigintmaior valor é18,446,744,073,709,551,615

KM.
fonte
8
2147483647 no máximo, então você só precisará aumentar o incremento automático se estiver trabalhando com vários bilhões de entradas? (que provavelmente apenas fazer suas instruções select derreter muito antes disso)
Kzqai
2
@ Tchalvak que é para int assinado, leia a documentação do mysql.
Leandro
8
O contexto da pergunta é sobre se o campo de incremento automático pode lidar com muitas linhas, e não as limitações de outros recursos
KM.
21
O pôster não está perguntando sobre tipos numéricos ou outros dados. . Realmente não entendo como isso pode ser sinalizado como uma resposta correta. Embora eu deva admitir que a pergunta é ambígua, devemos distinguir entre o tipo de dados PK e o número máximo de linhas para uma tabela.
Bery
1
@Bery, o OP distinguiu o que buscava ao selecionar isso como resposta. Aparentemente, eles estavam interessados ​​na capacidade do campo de incremento automático, que minha resposta aborda, e não nas limitações de outros recursos.
KM.
238

O maior valor de um número inteiro tem pouco a ver com o número máximo de linhas que você pode armazenar em uma tabela.

É verdade que, se você usar um int ou bigint como chave primária, poderá ter apenas tantas linhas quanto o número de valores exclusivos no tipo de dados da sua chave primária, mas não precisará tornar sua chave primária um número inteiro. , você pode torná-lo um CHAR (100). Você também pode declarar a chave primária em mais de uma coluna.

Existem outras restrições no tamanho da tabela além do número de linhas. Por exemplo, você pode usar um sistema operacional que tenha uma limitação de tamanho de arquivo. Ou você pode ter um disco rígido de 300 GB que pode armazenar apenas 300 milhões de linhas se cada linha tiver 1 KB de tamanho.

Os limites do tamanho do banco de dados são realmente altos:

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

O mecanismo de armazenamento MyISAM suporta 2 32 linhas por tabela, mas você pode construir o MySQL com a --with-big-tablesopção de suportar até 2 64 linhas por tabela.

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

O mecanismo de armazenamento do InnoDB não parece ter um limite no número de linhas, mas tem um limite no tamanho da tabela de 64 terabytes. Quantas linhas se ajustam a isso depende do tamanho de cada linha.

Bill Karwin
fonte
62
porcaria - eu gostaria de ter lido isso antes ... acabei de ultrapassar meu tamanho de 64 terrabytes em uma das minhas mesas e agora meu sistema está muito lento!
JM4 30/11/10
2 ^ 32 = 4,294,967,295 e 2 ^ 64 = 18,446,744,073,709,551,615 então ... O maior valor inteiro tem um pouco a ver com o número máximo de linhas. Não necessariamente a chave primária.
teynon
1
@ Tom, o InnoDB é o mecanismo de armazenamento padrão no MySQL 5.5 e é a melhor escolha em 99% dos casos.
Bill Karwin
2
@ Ext3h, o Sphinx Search é geralmente uma escolha melhor do que os índices de texto completo no MyISAM ou no InnoDB.
Bill Karwin
1
Para o mysql 8, o limite é de 256 TB com um tamanho de página de 64 KB.
precisa
13

Eu sugiro, nunca exclua dados. Não diga que se as tabelas tiverem mais de 1000 truncar o final da tabela. É necessário que haja lógica de negócios real em seu plano, por quanto tempo esse usuário está inativo. Por exemplo, se for mais de 1 ano, coloque-os em uma tabela diferente. Isso aconteceria semanal ou mensalmente em um script de manutenção no meio de um tempo lento.

Quando você encontra muitas linhas na sua tabela, deve começar a fragmentar as tabelas ou o particionamento e colocar dados antigos em tabelas antigas por ano, como users_2011_jan, users_2011_feb ou usar números para o mês. Em seguida, altere sua programação para trabalhar com este modelo. Talvez faça uma nova tabela com menos informações para resumir os dados em menos colunas e depois consulte as tabelas particionadas maiores quando precisar de mais informações, como quando o usuário estiver visualizando seu perfil. Tudo isso deve ser considerado com muito cuidado, para que no futuro não seja muito caro refatorar. Você também pode colocar apenas os usuários que acessam seu site o tempo todo em uma tabela e os usuários que nunca entram em um conjunto de tabelas arquivadas.

PHPGuru
fonte
1
A este respeito, é muito útil olhar para MySQL particionamento: dev.mysql.com/doc/refman/5.6/en/partitioning.html
Wim Deblauwe
10

No InnoDB, com um limite no tamanho da tabela de 64 terabytes e um limite de tamanho de linha do MySQL de 65.535, pode haver 1.073.741.824 linhas. Esse seria o número mínimo de registros utilizando o limite máximo de tamanho de linha. No entanto, mais registros podem ser adicionados se o tamanho da linha for menor.

Xylo
fonte
para armazenar tantas (1.073.741.824) linhas com limite de linhas de 65535, quanto tamanho de disco rígido é necessário? por favor sugira
davidb
1
O tamanho do disco rígido necessário não pode ser determinado com base no número de linhas e no tamanho da linha. O tamanho da tabela em si será de 64 terabytes. No entanto, os dados das colunas TEXT e BLOB são armazenados separados da linha e precisarão de espaço adicional. Além disso, isso dependerá do número e do tipo das colunas TEXT e BLOB, pois o tamanho varia dependendo do tipo. Existem quatro tipos de colunas TEXT, a saber, TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT. Existem também quatro tipos de colunas BLOB, a saber, TINYBLOB, MEDIUMBLOB, BLOB e LONGBLOB.
Xylo
2

De acordo com a seção Escalabilidade e Limites em http://dev.mysql.com/doc/refman/5.6/en/features.html , o MySQL suporta grandes bancos de dados. Eles usam o MySQL Server com bancos de dados que contêm 50 milhões de registros. Alguns usuários usam o MySQL Server com 200.000 tabelas e cerca de 5.000.000.000 de linhas.

Dados
fonte
poderia ajudar se você também nos dissesse que tipo de hardware "Eles" estavam usando
my account_ram
Na verdade, você está certo. Mas infelizmente 'eles' não fizeram nada sobre o hardware
Data
@myaccount_ram desculpe necromance isso, mas se for útil eu vi os limites menos teóricos e mais práticos da produção MySQL em ação. Eu vi um banco de dados com ~ 18 bilhões de linhas em duas instâncias da AWS 2x db.r4.16xlarge (1 leitor, 1 escritor). Cada uma das máquinas tinha 64 núcleos de CPU, 488 GB de ram, link de rede de 25 Gbps e 64 TB de disco. Essa escala de banco de dados estava ultrapassando os limites de tamanho da CPU e do disco, e a AWS não fornece instâncias maiores otimizadas para DB. Foi substituído por um esquema db mais simples que não exigia tantas linhas.
Skylar Brown
1

Limites de tamanho de linha

The maximum row size for a given table is determined by several factors:
  • A representação interna de uma tabela MySQL tem um limite máximo de tamanho de linha de 65.535 bytes, mesmo que o mecanismo de armazenamento seja capaz de suportar linhas maiores. As colunas BLOB e TEXT contribuem apenas de 9 a 12 bytes para o limite de tamanho da linha porque seu conteúdo é armazenado separadamente do restante da linha.

  • O tamanho máximo da linha para uma tabela do InnoDB, que se aplica aos dados armazenados localmente em uma página do banco de dados, é um pouco menos que meia página. Por exemplo, o tamanho máximo da linha é um pouco menor que 8 KB para o tamanho da página padrão do InnoDB de 16 KB, definido pela opção de configuração innodb_page_size. " Limites nas tabelas do InnoDB ".

  • Se uma linha contendo colunas de tamanho variável exceder o tamanho máximo da linha do InnoDB, o InnoDB selecionará colunas de tamanho variável para armazenamento externo fora da página até que a linha se ajuste ao limite de tamanho da linha do InnoDB. A quantidade de dados armazenados localmente para colunas de tamanho variável que são armazenadas fora da página varia de acordo com o formato da linha. Para obter mais informações, consulte “ Armazenamento de linha do InnoDB e formatos de linha ”.
  • Diferentes formatos de armazenamento usam quantidades diferentes de dados de cabeçalho e trailer da página, o que afeta a quantidade de armazenamento disponível para linhas.
Saurabh Chandra Patel
fonte
1

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

Limites de tamanho de linha

O tamanho máximo da linha para uma determinada tabela é determinado por vários fatores:

A representação interna de uma tabela MySQL tem um limite máximo de tamanho de linha de 65.535 bytes, mesmo que o mecanismo de armazenamento seja capaz de suportar linhas maiores. As colunas BLOB e TEXT contribuem apenas de 9 a 12 bytes para o limite de tamanho da linha porque seu conteúdo é armazenado separadamente do restante da linha.

O tamanho máximo da linha para uma tabela do InnoDB, que se aplica aos dados armazenados localmente em uma página do banco de dados, é um pouco menos de meia página para as configurações innodb_page_size de 4KB, 8KB, 16KB e 32KB. Por exemplo, o tamanho máximo da linha é um pouco menor que 8 KB para o tamanho da página padrão do InnoDB de 16 KB. Para páginas de 64 KB, o tamanho máximo da linha é um pouco menor que 16 KB. Consulte a Seção 15.8.8, “Limites nas tabelas do InnoDB”.

Se uma linha contendo colunas de tamanho variável exceder o tamanho máximo da linha do InnoDB, o InnoDB selecionará colunas de tamanho variável para armazenamento externo fora da página até que a linha se ajuste ao limite de tamanho da linha do InnoDB. A quantidade de dados armazenados localmente para colunas de tamanho variável que são armazenadas fora da página varia de acordo com o formato da linha. Para obter mais informações, consulte a Seção 15.11, “Armazenamento de linha do InnoDB e formatos de linha”.

Diferentes formatos de armazenamento usam quantidades diferentes de dados de cabeçalho e trailer da página, o que afeta a quantidade de armazenamento disponível para linhas.

Para obter informações sobre os formatos de linha do InnoDB, consulte a Seção 15.11, “Armazenamento de linha do InnoDB e formatos de linha” e a Seção 15.8.3, “Estrutura de linha física das tabelas do InnoDB”.

Para obter informações sobre os formatos de armazenamento MyISAM, consulte a Seção 16.2.3, “Formatos de armazenamento de tabelas MyISAM”.

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

Md Nazrul Islam
fonte
-3

Não há limite. Depende apenas da memória livre e do tamanho máximo do arquivo do sistema. Mas isso não significa que você não deve tomar medidas de precaução ao lidar com o uso de memória em seu banco de dados. Sempre crie um script que possa excluir linhas que estão fora de uso ou que manterá o total de linhas dentro de uma determinada figura, digamos mil.

9jamkt
fonte
8
Excluir linhas que você acha que estão 'fora de uso' é perigoso e causa muito mais problemas do que resolve. Um desenvolvedor anterior de um dos meus projetos implementou um script que excluía carrinhos de compras com mais de três dias, pensando que estava fazendo a coisa certa. Adivinha o quê, isso causa problemas semanalmente. Exclua os dados apenas se você realmente precisar.
Ben Hitchcock
o pior caso é quando alguém começa a armazenar caminhos de arquivos em um banco de dados ... feno para onde foram todos os meus arquivos de projeto ... eu tenho um pequeno projeto que começa com arquivos de 3,5 milhões, adivinhem ... eles não são todos usado com freqüência.
Kendrick