Banco de dados muito grande, parte muito pequena sendo a maioria recuperada em tempo real

3

Eu tenho um problema interessante no banco de dados. Eu tenho um DB que tem 150GB de tamanho. Meu buffer de memória é de 8GB.

A maioria dos meus dados raramente está sendo recuperada ou principalmente recuperada por processos de back-end. Eu preferiria muito mais mantê-los por perto, porque alguns recursos exigem deles.

Algumas delas (ou seja, algumas tabelas e algumas partes identificáveis de certas tabelas) são usadas com muita frequência em uma maneira voltada para o usuário

Como posso ter certeza de que o último está sempre sendo mantido na memória? (há espaço mais que suficiente para estes)

Mais informações: Estamos no Ruby on rails. O banco de dados é MYSQL, nossas tabelas são armazenadas usando INNODB. Estamos compartilhando os dados em duas partições. Como estamos compartilhando, armazenamos a maioria dos nossos dados usando blobs JSON, enquanto indexamos apenas as chaves primárias

    
por Warner 20.05.2010 / 19:39

2 respostas

1

Há muitas opções aqui. Primeiro, o NDB é Mecanismo de clusterização do MySQL, que armazena dados na memória. O NDB tem algumas limitações , no entanto.

memcached é uma solução popular que é frequentemente usada, mas requer a arquitetura do aplicativo para suportá-la.

Você pode ter tabelas MyISAM que você armazena especificamente dentro de um disco RAM, já que elas podem ser realocadas individualmente, diferentemente do InnoDB. Todo espaço de tabela do InnoDB teria que ser armazenado no disco RAM.

Você pode encontrar o mecanismo de memória mais adequado do que o meu RAM disco hack, no entanto. Eles também são mais limitados que outros mecanismos, já que não podem suportar BLOBs entre outras coisas. Para os dados a serem mantidos, você teria que ter um script de wrapper para despejar e restaurar os dados. Isso também introduz riscos aos dados, já que uma perda de energia, mesmo com scripts, resultaria em perda de dados.

Em última análise, você provavelmente se beneficiará mais de ajustar e otimizar corretamente o banco de dados e as consultas do MySQL. Um banco de dados MySQL com ajuste adequado utiliza o cache de memória.

Há muitos recursos disponíveis sobre isso, tanto no Serverfault quanto na Internet como um todo. O MySQL tem um documento e aqui está um MySQL post de blog de desempenho , que são recursos muito úteis. Aqui está outro post onde eles têm uma fórmula para calcular o uso da memória do InnoDB.

    
por 20.05.2010 / 19:51
0

O melhor que você provavelmente pode fazer é examinar os planos de execução para suas consultas de longa duração e sintonizar 1) a consulta e 2) o banco de dados apropriadamente. Você pode criar índices para as "partes identificáveis de certas tabelas" para agilizar as consultas. Você também pode mover seus dados usados com mais freqüência para sua própria tabela e os dados usados com menos frequência para si.

Fazer isso com blobs JSON será difícil, pois se você precisar acessar um atributo do blob JSON, precisará buscar e analisar o blob inteiro. Se seus blobs JSON estiverem em um formato consistente, construa uma estrutura de tabela real para refletir isso, e você provavelmente 1) já melhorou o desempenho e 2) terá uma estrutura muito mais flexível quando precisar ajustar o desempenho posteriormente.

    
por 20.05.2010 / 19:51