Mysql
 sql >> Database >  >> RDS >> Mysql

Come gestire la chiave esterna durante il partizionamento

Leggi:Limitazioni di partizionamento MySQL

1.) Gli FK non sono supportati su tabelle partizionate.

  • Un'opzione è creare una procedura memorizzata che inserisca/aggiorna il record e verificare all'interno della procedura che l'ID utente passato sia presente nella tabella utenti prima che avvenga l'inserimento. È necessario impostare le autorizzazioni sulla tabella in modo che solo l'SP possa aggiornare e inserire per consentire alle applicazioni e/o agli utenti di eseguire il backdoor del controllo. Dovrai anche prendere delle precauzioni quando rimuovi gli utenti dalla tabella degli utenti.

2.) La colonna che usi per il partizionamento dipenderà da come accedi alla tabella. Se le tue query sono sempre basate sul numero del veicolo, probabilmente ha senso eseguire una partizione hash su quella colonna. Se stai interrogando o segnalando di più su qualcosa come "quali veicoli sono stati aggiunti questo mese" o se vuoi "lanciare" le partizioni quando raggiungono una certa età, allora la partizione per data potrebbe essere la strada da percorrere. Questo è qualcosa che dovrai decidere in base al tuo utilizzo.

3.) Vedere il collegamento sopra per ulteriori informazioni.

Modifica in base alla domanda dell'utente:

L'inserimento di un record ogni 3 secondi non è molto dispendioso. Assicurati di avere una chiave primaria nella tabella degli utenti in modo che il controllo all'interno della procedura venga eseguito in modo efficiente. (Questo è vero anche se gli FK fossero supportati) Il DB farebbe questo controllo per te dietro le quinte se avessi il supporto per gli FK, quindi in questo senso, non ti fa male. Se il controllo finisce per essere un collo di bottiglia, potresti sentire la necessità di eliminarlo e possibilmente segnalare gli ID utente errati come un processo batch notturno, ma se la tua tabella utente è relativamente piccola e indicizzata correttamente, non vedo che questo sia un problema.

Un'altra opzione sarebbe quella di eseguire il partizionamento manualmente (cioè il partizionamento orizzontale) con tabelle partizionate o non partizionate. Con le tabelle non partizionate, ovviamente, potresti usare chiavi esterne native. Ad esempio, divideresti la tabella dei veicoli in più tabelle come:(supponendo che tu voglia utilizzare il VehicleNo come "chiave")

Veicoli NosLessThan1000

Veicoli NosLessThan2000

VeicoliNosLessThan...

VeicoliNosLessThanMAX

Qui probabilmente vorrai avere di nuovo un SP in modo che l'applicazione/utente non debba conoscere le tabelle. L'SP sarebbe responsabile dell'inserimento/aggiornamento della tabella corretta in base al veicolo No passato. Vorresti anche un SP per selezionare i dati in modo che l'app/l'utente non debba nemmeno conoscere la tabella da cui selezionare. Per un facile accesso a tutti i dati, puoi creare una vista che unisca tutte le tabelle insieme.

Si noti che un vantaggio di ciò è che attualmente MyISAM blocca un'intera tabella partizionata durante gli aggiornamenti, non solo la partizione che sta aggiornando. Il partizionamento orizzontale di una tabella in questo modo allevia tale contesa perché le tabelle stesse sono le "partizioni".

Sulla base dei dati limitati che ho su ciò che stai facendo, probabilmente scriverei 2 stored procedure, 1 per selezionare i dati e 1 per aggiornare/inserire i dati e fare in modo che la tua applicazione li utilizzi per tutti gli accessi. Quindi proverei prima il partizionamento regolare tramite hash su vehicleNo applicando la chiave user_id all'interno della procedura. Se questo diventa un problema, puoi facilmente migrare allo sharding dei dati su più tabelle senza dover cambiare l'applicazione perché tutta la logica su come recuperare e aggiornare i dati è contenuta negli SP.