Estou trabalhando em um aplicativo que envolve uma execução muito alta de consultas de atualização / seleção no banco de dados.
Eu tenho uma tabela base (A) que terá cerca de 500 registros para uma entidade por um dia. E para cada usuário no sistema, uma variação dessa entidade é criada com base em algumas das preferências do usuário e elas são armazenadas em outra tabela (B). Isso é feito por um trabalho cron que é executado à meia-noite todos os dias.
Portanto, se houver 10.000 usuários e 500 registros na tabela A, haverá 5 milhões de registros na tabela B para esse dia. Sempre mantenho dados por um dia nessas tabelas e à meia-noite arquivo dados históricos no HBase. Esta configuração está funcionando bem e não estou tendo problemas de desempenho até o momento.
Ultimamente, houve alguma alteração nos requisitos de negócios e agora alguns atributos na tabela base A (para 15 - 20 registros) serão alterados a cada 20 segundos e, com base nisso, tenho que recalcular alguns valores para todos esses registros de variação na tabela B para todos os usuários. Embora apenas 20 registros mestre sejam alterados, preciso fazer um recálculo e atualizar 200.000 registros de usuários, o que leva mais de 20 segundos. A próxima atualização ocorre eventualmente, resultando em todas as consultas Select sendo enfileiradas. Estou recebendo cerca de três solicitações / 5 segundos de usuários on-line, o que resulta em 6-9 consultas selecionadas. Para responder a uma solicitação de API, eu sempre uso os campos na tabela B.
Posso comprar mais poder de processamento e resolver essa situação, mas estou interessado em ter um sistema adequadamente dimensionado que possa lidar com até um milhão de usuários.
Alguém aqui pode sugerir uma alternativa melhor? O banco de dados relacional nosql + me ajuda aqui? Existem plataformas / datastores que me permitem atualizar os dados frequentemente sem bloquear e, ao mesmo tempo, me dão a flexibilidade de executar consultas selecionadas em vários campos de uma entidade?