Em que tamanho de dados se torna benéfico mudar do SQL para o NoSQL?


24

Como programador de banco de dados relacional (na maioria das vezes), li artigos sobre como os bancos de dados relacionais não são dimensionados, e as soluções NoSQL, como o MongoDB. Como a maioria dos bancos de dados que desenvolvi até o momento é de pequena e média escala, nunca tive um problema que não tenha sido resolvido por alguma indexação, otimização de consulta ou redesenho de esquema.

Com que tipo de tamanho eu esperaria ver o MySQL lutando. Quantas linhas?

(Eu sei que isso vai depender da aplicação e do tipo de dados armazenados. Aquele que me chamou foi basicamente um banco de dados de genética, portanto, haveria uma tabela principal, com 3 ou 4 tabelas de pesquisa. A tabela principal conterá entre outras coisas, uma referência cromossômica e uma coordenada de posição.É provável que seja consultado um número de entradas entre duas poções em um cromossomo, para ver o que está armazenado lá).


4
Você provavelmente não deve trabalhar sob a suposição de que o MySQL é o limite superior para o número de linhas que um banco de dados relacional pode manipular. Você está realmente fazendo duas perguntas: Quando o MySQL fica sem string? e quais são os limites da capacidade do SQL RDBMS? Qual você quer que seja respondido?
Blrfl

Respostas:


13

Qual o tamanho dos dados?

Existem dois limites significativos:

  1. dados completos cabem na RAM
  2. todos os dados do índice se encaixam na RAM

Com SSDs rápidos, o primeiro limite se tornou um pouco menos problemático, a menos que você tenha um tráfego alto e louco.

Acidez

Um dos problemas com o dimensionamento de RDBMSes é que, por design, eles são ACID, o que significa transações e bloqueios de nível de linha (ou mesmo nível de tabela em alguns RDBMSes mais antigos / mais simples). Pode ser um fator limitante se você tiver muitas consultas modificando muitos dados em execução ao mesmo tempo. As soluções NoSQL geralmente usam um modelo de consistência eventual .

Como o RDBMS é escalado no tamanho dos dados?

Não é inteiramente verdade que o RDBMS não pode ser dimensionado no tamanho dos dados, existem duas alternativas: particionamento vertical e horizontal (também conhecido como sharding).

O particionamento vertical é basicamente manter tabelas não relacionadas em servidores de banco de dados separados, mantendo assim o tamanho de cada um abaixo dos limites mencionados acima. Isso torna a junção dessas tabelas usando SQL simples menos direta e menos eficiente.

Sharding significa distribuir dados de uma tabela entre vários servidores, com base em chaves específicas. Isso significa que, para pesquisas, você sabe qual servidor consultar com base nessa chave. No entanto, isso complica consultas que não são pesquisas na chave de fragmentação.

No caso de ambos os tipos de particionamento, se você for a extremos, basicamente acaba com a mesma situação que os bancos de dados NoSQL.


9
Oracle, PostgreSQL, MySQL, MS SQL Server e Sybase são todos capazes de fazer junções em tabelas em servidores remotos sem que o cliente precise executar qualquer trabalho.
Blrfl

4
Sobre "dados completos na RAM", lembre-se de que trata-se do conjunto de trabalho real. Muitas vezes, os bancos de dados são maiores do que a memória, mas a maior parte é raramente acessado, tendo que no disco não é tão ruim, enquanto índices e, muitas vezes linhas buscadas etc estão na memória
Johannes

2
@vartec Então, você deseja remover meus e-mails de 2 anos do meu banco de dados de e-mail, pois eu o pesquiso apenas uma vez por mês, enquanto meu conjunto de trabalho principal são os últimos dez e-mails apenas?
Johannes

3
@ dica wobbily_col: não é. a menos que você não se preocupe com consistência, confiabilidade ou durabilidade. nesse caso, você pode desativar muitas coisas que tornam uma muito mais rápida que a outra, ou vice-versa, se desejar. adivinhe quais são as configurações padrão em cada uma? (claro, o MySQL não é o pináculo da segurança de dados ou ...)
Javier

1
@vartec "Fragmento automático" é bom, onde é aplicável. Mas, de repente, você não pode mais juntar todos os dados - oh, espere, você não pode fazer isso com um banco de dados de documentos; também, pesquisar todos os dados ou criar relatórios se torna tedioso ... sim, os bancos de dados de documentos têm seu lugar, quando o modelo de dados e operações corresponderem, mesmo para outros sistemas de ... quantidade de dados por si só não é um factor (eu sei de instâncias do MySQL o suficiente correndo com dados da região de terabyte com sucesso ... e projetos com algumas centenas de MB falha)
Johannes

13

Não acho que o tamanho dos dados seja o único fator. "Modelo de dados" também é uma parte muito importante.

As páginas do catálogo de comércio eletrônico (Solr, ElasticSearch), dados de análise da web (Riak, Cassandra), preços das ações (Redis), conexões de relacionamento nas redes sociais (Neo4J, FleetDB) são apenas alguns exemplos quando uma solução NoSQL realmente brilha.

IMHO, o modelo de dados tem um papel mais importante que o tamanho dos dados ao considerar uma solução NoSQL ou RDBMS.


9
Exatamente. todo esse "big data" bla bla crap é marketing e todo o "NoSQL para big data!" coisas também. O NoSQL é bom para grandes conjuntos de dados, porque é mais rápido que um RDBMS tradicional, mas é mais rápido devido às enormes vantagens e desvantagens de recursos que faz. Muitos modelos de dados sofrerão significativamente, considerando essas compensações, enquanto alguns funcionarão bem. É uma questão de saber o que você está perdendo quando acessa o NoSQL e usa apenas o NoSQL para dados que podem sofrer essas perdas.
Jimmy Hoffa

1
Embora seja verdade, não é a resposta para a pergunta.
vartec

Esta não é apenas NÃO a resposta, mas também NÃO é verdade. Você pode criar um documento como tabela no banco de dados SQL apenas usando o tipo de dados JSON e fazer o banco de dados SQL brilhar sobre o NoSQL.
Yevgeniy Afanasyev

6

Se os bancos de dados relacionais não escalam, nada faz. Não se preocupe com problemas de dimensionamento.

O SQL tem problemas com alguns tipos de análise, mas não são necessários muitos dados para acionar o problema. Por exemplo, considere uma única tabela com uma coluna que faça referência a outras linhas com base em uma chave exclusiva. Normalmente, isso pode ser usado para criar uma estrutura em árvore. Você pode escrever instruções SQL rápidas que fazem referência à linha relacionada. Ou a linha relacionada da linha relacionada. Na verdade, você pode fazer qualquer número específico de saltos. Mas se, para cada linha, você deseja selecionar um campo na primeira linha relacionada da cadeia que atenda a algum critério, fica complicado.

Considere uma tabela de locais de escritórios nos níveis de país, província / estado, município, cidade e vila, com cada escritório referenciando o escritório ao qual se reporta. Não garantia de que o escritório de relatórios de cada escritório esteja apenas um nível acima. Para um conjunto selecionado de escritórios, nem todos em um nível, você deseja listar o escritório nacional associado de cada um. Isso requer loops de instruções SQL e levará muito tempo até hoje. (Eu costumava ter 30 segundos em uma seleção de 30 escritórios, mas isso foi há muito tempo - e mudar para procedimentos armazenados ajudou um pouco.)

Portanto, a alternativa é colocar toda a estrutura em um grande bloco de dados, rotular e armazenar. Quando quiser analisar os dados, leia tudo na memória de uma só vez, configurando indicadores para rastrear a estrutura e você poderá processar alguns milhões de escritórios em um piscar de olhos.

Nada disso tem muito a ver com a quantidade de dados. A chave é a natureza da organização dos dados. Se um layout relacional ajudar, então um RDBMS é o que você deseja. Caso contrário, algum tipo de armazenamento em massa será ligeiramente mais rápido que um quatrilhão de vezes.

Observe que, se um desses conjuntos de dados se tornar muito grande para caber na memória, seu banco de dados não-SQL não funcionará mais. Outro problema é quando você precisa de dados de mais de um bloco por vez; você pode fazer isso se , e somente se, todos os blocos couberem na memória de uma só vez. E o usuário tem que esperar enquanto você os carrega.

Se o seu banco de dados relacional lhe causar problemas, ele será feito antes de você colocar muitos dados nele. O único problema de dimensionamento que você pode ter é com o seu programa quando o bloco de dados que você está montando para um banco de dados nosql - se você precisar usá-lo - se torna grande demais para ele. (Leia sobre erros de falta de memória. Os idiomas mais novos às vezes fazem coisas estranhas com a memória.)


0

Acho que o primeiro motivo para acessar uma solução NoSQL ou Distribuída não é tanto o tamanho de todos os dados, mas o tamanho das tabelas. O que as soluções distribuídas fazem bem é dividir as tabelas em diferentes nós; quando você precisar consultar as tabelas, cada nó processará sua parte da tabela.

Os RDBMSs podem fazer isso, mas a nova onda de bancos de dados NoSQL foi criada para fazer isso. Oracle, MSSQL, MySQL pegaram seu modelo centralizado e o aprimoraram para fazê-lo funcionar em um ambiente distribuído. No entanto, eles ainda seguem regras estritas de ACID, enquanto alguns dos novos bancos de dados não seguem regras estritas, como o uso de consistência eventual.

Não há uma quantidade definida de dados em que você deve escolher um sobre o outro. O que precisa ser levado em consideração são as necessidades do banco de dados e a quantidade de uso que ele recebe. Os bancos de dados NoSQL podem processar conjuntos de dados maiores mais rapidamente, enquanto os bancos de dados relacionais dão a você a confiança de que seus dados estão corretos com os princípios do ACID.


0

Também vale a pena mencionar que seu modelo de dados tem uma grande influência sobre as coisas. Se você precisar criar alguma forma de estrutura em árvore (ou seja, você tiver uma chave estrangeira auto-referente em uma tabela que contenha a chave estrangeira em uma chave primária composta), provavelmente deverá fazer isso em algum tipo de banco de dados que lida com esses tipos de dados muito bem (como mongodb ou couchdb).

Como outras pessoas disseram, você também deve levar em consideração o que está acontecendo no seu aplicativo. se você realmente precisar de ACID em várias tabelas, precisará realmente usar um RDBMS, mas se tiver algo em que possa ter alguns dados obsoletos e precisar da flexibilidade de um esquema NoSQL (chame-o sem esquema, se quiser, mas sim ainda possui alguma forma de esquema implícito), então você pode considerar comprar uma loja NoSQL ( http://www.10gen.com/customers/craigslist) aqui está um exemplo de por que o craigslist mudou ... mas é certo que eles estão arquivando ~ 10 TB de que eu sei que não se encaixam no tamanho de seu banco de dados, de tamanho pequeno a médio. Mas o caso de uso pode ser útil).

Lembre-se de que os sistemas NoSQL não estão necessariamente lá para substituir os RDMSs, mas, em muitos casos, você pode complementar seu RDBMS com a idéia de Polyglot Persistence e pode armazenar a maioria dos seus dados em um RDBMS, mas em casos específicos de nicho, pode descarregar alguns de seus dados para alguma forma de armazenamento NoSQL.


0

Mongopode ser instalado em vários computadores / nós. PostgreSQLnão fornece ferramenta interna para sharding, no entanto, o citus existe.

O MongoDB suporta bancos de dados de até 64 terabytes e o tamanho do documento é de 16 megabytes.

O MySQL possui um limite de banco de dados de 256 terabytes, 64 terabytes do tamanho máximo de uma tabela e limite de registro de 4 gigabytes

O PostgreSQL não tem limite no banco de dados (existem 4 terabytes em algum lugar para teste) e um limite de 1 gigabyte para o tamanho de qualquer campo em uma tabela e novamente 64 terabytes para o tamanho máximo de uma tabela.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.