Decisioni sull'architettura del database

4

Non conosco troppe cose sui database, quindi molte domande riguardanti l'architettura sono venute fuori ultimamente. Due di queste cose sono:

  1. Se ho una tabella con molte voci (probabilmente milioni), come posso rendere più veloci le query select ? Ho pensato di ordinare la tabella alfabeticamente e poi di dividerla in due, ma ciò non sembra rendere le cose più facili per me. Hai qualche suggerimento?

  2. Ho una tabella utente e un messaggio . Nel messaggio dovrei avere sender_id e receiver_id . Da quello che so, non posso renderli entrambi chiavi esterne per utente , quindi devo sceglierne uno. Tuttavia, questo non porta a un'incoerenza dei dati (che, per quanto ne so, è errata)? Qual è l'approccio giusto qui?

Non penso che sia importante, ma io uso MySQL 5.5.

    
posta Dragos 01.05.2012 - 14:33
fonte

3 risposte

10
  1. Aggiungi indici sulle colonne utilizzate nelle clausole WHERE. In un caso estremo, usa sharding , ma questo è se stai parlando di miliardi di righe (almeno ), non milioni. Inoltre, per query complesse con più join e sottoquery, la struttura della query può fare una grande differenza. L'ottimizzatore di query del DB dovrebbe occuparsene, ma a volte può creare problemi o richiedere ulteriori informazioni (ad esempio statistiche DB aggiornate). A questo punto hai davvero bisogno di un DBA esperto. E ovviamente anche la struttura del DB ha un grande effetto. A volte devi denormalizzare o semplicemente correggere uno schema fondamentalmente rotto.

  2. È sicuramente possibile avere vincoli di chiave esterna su più colonne di una tabella che fanno tutti riferimento alla stessa colonna in una tabella diversa. Così fai.

risposta data 01.05.2012 - 14:38
fonte
4

If I have a table with a lot of entries(millions probably), how can I make the select queries faster?

Devi aggiungere indici alla tabella - il modo in cui viene fatto è diverso da database a database, quindi è necessario consultare la documentazione di MySQL 5.5. Per quanto riguarda la scelta di un buon indice - sono stati scritti libri su questo argomento ... Qui è una introduzione all'argomento.

I have a table user and one message. In message I should have sender_id and receiver_id. From what I know, I can't make them both foreign keys for user

Sai male. Puoi certamente rendere ognuno di loro una chiave straniera per l'utente, indipendentemente.

    
risposta data 01.05.2012 - 14:37
fonte
0

If I have a table with a lot of entries(millions probably), how can I make the select queries faster? I thought about sorting the table alphabetically and then splitting it in two, but that doesn't seem to make things easier for me. Do you have any suggestions?

Questa è una domanda a risposta aperta ENORME. Innanzitutto, ricorda questo:

  • Non dovresti mai eseguire l'ottimizzazione a meno che tu non veda effettivamente problemi di prestazioni. Stai riscontrando problemi di prestazioni?

Se lo sei, dovresti investigare ulteriormente per determinare quali sono quei problemi di prestazioni. Com'è la tua domanda? Utilizza indici? Se usi EXPLAIN ti dirà che tipo di indici vengono usati, e aiuta a spiegare cosa è lento / scarsamente ottimizzato sulla query.

I have a table user and one message. In message I should have sender_id and receiver_id. From what I know, I can't make them both foreign keys for user, so I have to pick one of them.

Perché non puoi? MySQL ti consentirà di farlo: l'approccio RIGHT è quello di renderli entrambi chiavi esterne.

    
risposta data 01.05.2012 - 15:05
fonte

Leggi altre domande sui tag