Ter muitas tabelas em um banco de dados Mysql pode afetar o desempenho?

10

Ter muitas tabelas (200 por exemplo) em uma única instância de banco de dados Mysql pode reduzir o desempenho?

user25704
fonte

Respostas:

8

Em geral, quanto mais você tiver, reduzirá o desempenho. No entanto, 200 parece ser um número bastante pequeno. 2.000 podem ser um sucesso real e, definitivamente, 20.000. Em geral, porém, você deve manter seu número de tabelas pequeno, pois o MySQL pode lidar com um número muito grande de linhas na tabela.

Topher Fangio
fonte
7
Um grande número de tabelas pode fazer uma enorme diferença se o seu aplicativo usar 'information_schema'. Nada no 'information_schema' é armazenado em cache. Vários sistemas ORM diferentes fazem uso pesado disso.
Zoredache
4

O número de tabelas não importa tanto quanto:

  1. Quais consultas você está executando - é provável que você não esteja consultando todas as 200 em uma única consulta
  2. A carga geral da consulta no sistema em um determinado momento

Ter tabelas em excesso significa memória e espaço no disco rígido que podem ser recuperados e usados ​​para outras coisas. Lembre-se de que desnormalizar suas tabelas aumenta o risco de dados incorretos porque você está se livrando da integridade referencial.

Pôneis OMG
fonte
4

Em geral, 200 tabelas não devem ser um problema, mas isso depende de várias coisas.

Servidor MySQL vs Servidor dedicado compartilhado com outro software, 128 MB vs 128 GB de RAM etc., pequenas tabelas com poucos registros versus tabelas com blobs e milhões de linhas.

O MySQL possui várias configurações e vários mecanismos, cada um afetando o desempenho das tabelas de maneiras diferentes.

O MyISAM normalmente possui três arquivos por tabela .frm, .MYD, .MYI

INNODB no modo normal possui .frm com todos os dados armazenados no arquivo central

INNODB em um arquivo por modo de tabela possui .frm, .idb

table_open_cache é o número de tabelas que podem ser abertas ao mesmo tempo (Padrão 64). Pode ser necessário que seja maior que o número de tabelas no esquema, pois está relacionado a quantas conexões estão consultando o banco de dados. 100 conexões juntam-se a 3 tabelas, pode significar que você tem 300 tabelas em cache mais quaisquer tabelas temporárias. Geralmente, um esquema ou conexões mais complexos, quanto maior o número.

open-files-limit Eu costumo definir isso como 4x table_open_cache, que deve ser generoso, em vez de se preocupar em calcular um valor exato.

O limite de manipulação de arquivos dos sistemas operacionais para o usuário mysql também pode ser um problema (no linux, o padrão geralmente pode ser 1024, ulimit -n para mostrar os limites do usuário) isso pode causar um problema com um grande número de tabelas quando é menor que o número o mysql requer. Deve ser pelo menos o mesmo que o limite de arquivos abertos.

Como em qualquer banco de dados, existem centenas de parâmetros de ajuste que você pode ajustar para otimizar o banco de dados para seu esquema específico. O MySQL é pior para isso do que para a maioria, pois você pode conectar mecanismos extras, se desejar, ou seja, o mecanismo de cluster NDB.

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

Espero que ajude


fonte
2

Para o índice de cada tabela, o MySQL tem seu próprio índice. O índice leva a memória para manter e usar, e há um limite global para índices. Quando existem muitas tabelas, nem todos os índices podem estar na RAM; portanto, eles vão para o disco, o que afeta diretamente o desempenho. Tente aumentar isso em my.cnf:: key_buffer_size=256Mé a quantidade de RAM reservada para armazenar informações do índice.

Kolypto
fonte
1

Pode? Certo. Mas quanto depende muito do seu aplicativo e de seus padrões de acesso, e se você estiver usando myisam ou innodb, e se o innodb estiver no modo arquivo por tabela ou não, e o tamanho dos logs do innodb. Você precisará nos fornecer mais detalhes do que isso.

Jim Zajkowski
fonte
1

Não - não acho que o número de tabelas seja o gargalo de desempenho em seu sistema. Afinal, eles são apenas arquivos no seu sistema de arquivos. Não há nada incomum em ter centenas de tabelas em um banco de dados.

Muito mais provável é que suas consultas não sejam adequadamente otimizadas. Eu recomendaria ativar o log-slow-queriese log-queries-not-using-indexes. Ao identificar consultas lentas, use a explainopção para exibir o plano de consulta para essas consultas e identificar os locais em que os índices estão ausentes.

Consulte http://dev.mysql.com/doc/refman/5.0/en/slow-query-log.html para obter mais detalhes.

codeinthehole
fonte