Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como lidar com chave estrangeira durante o particionamento


Leia:Limitações de particionamento do MySQL

1.) FKs não são suportados em tabelas particionadas.
  • Uma opção é criar um procedimento armazenado que insere/atualiza o registro e verificar dentro do procedimento se o ID do usuário passado está presente na sua tabela de usuários antes que a inserção ocorra. Você deve configurar as permissões na tabela para que apenas o SP tenha permissão para atualizar e inserir para permitir que aplicativos e/ou usuários façam backdoor na verificação. Você também precisará tomar precauções ao remover usuários da tabela de usuários.

2.) Qual coluna você usa para particionamento dependerá de como você está acessando a tabela. Se suas consultas são sempre baseadas no número do veículo, provavelmente faz sentido fazer uma partição de hash nessa coluna. Se você está consultando ou relatando mais sobre algo como "quais veículos foram adicionados este mês" ou deseja "lançar" partições à medida que atingem uma certa idade, o particionamento na data pode ser o caminho a percorrer. Isso é algo que você terá que decidir com base no seu uso.

3.) Veja o link acima para mais informações.

Editar com base na pergunta do usuário:

Inserir um registro a cada 3 segundos não é muito produtivo. Certifique-se de ter uma chave primária em sua tabela de usuários para que a verificação dentro do procedimento seja feita com eficiência. (Isso é verdade mesmo se FKs fossem suportados) O DB estaria fazendo essa verificação para você nos bastidores se você tivesse suporte para FKs, então, nesse sentido, não está prejudicando você. Se a verificação acabar sendo um gargalo, você pode sentir a necessidade de eliminá-la e possivelmente relatar IDs de usuário errôneas como um processo em lote noturno, mas se sua tabela de usuários for relativamente pequena e indexada corretamente, não vejo isso como uma questão.

Outra opção seria fazer o particionamento manualmente (ou seja, fragmentação) com tabelas particionadas ou não particionadas. Com as tabelas não particionadas, é claro, você pode usar chaves estrangeiras nativas. Por exemplo, você dividiria sua tabela de veículos em várias tabelas como:(assumindo que você deseja usar o veículoNo como a "chave")

VeículosNosMenosQue1000

VeículosNosMenosQue2000

VeículosNosMenosQue...

VeículosNosMenosQueMAX

Aqui você provavelmente quer ter um SP novamente para que o aplicativo/usuário não precise saber sobre as tabelas. O SP seria responsável por inserir/atualizar a tabela correta com base no VehicleNo passado. Você também desejaria um SP para selecionar dados para que o aplicativo/usuário não precisasse conhecer a tabela para selecionar. Para facilitar o acesso a todos os dados, você pode criar uma exibição que une todas as tabelas.

Observe que um benefício disso é que atualmente o MyISAM bloqueia uma tabela particionada inteira durante as atualizações, não apenas a partição que está atualizando. Fragmentar uma tabela dessa maneira alivia essa contenção porque as próprias tabelas são as "partições".

Com base nos dados limitados que tenho sobre o que você está fazendo, provavelmente escreveria 2 procedimentos armazenados, 1 para selecionar os dados e 1 para atualizar/inserir os dados e fazer com que seu aplicativo os usasse para todos os acessos. Então eu tentaria o particionamento regular via hash no veículoNo primeiro enquanto aplicava a chave user_id dentro do procedimento. Se isso se tornar um problema, você poderá migrar facilmente para fragmentar os dados em várias tabelas sem precisar alterar o aplicativo, pois toda a lógica sobre como recuperar e atualizar os dados está contida nos SPs.