Quali sono alcuni buoni consigli per uno sviluppatore che prova a progettare un database MySQL scalabile?

3

Come afferma la domanda, sono uno sviluppatore, non un DBA. Ho esperienza nella progettazione di buoni schemi ER e sono abbastanza informato sulla normalizzazione e sulla buona progettazione dello schema. Ho anche lavorato con data warehouse che utilizzano la modellazione dimensionale con tabelle fact e tabelle dim.

Tuttavia, tutte le applicazioni basate su database che ho sviluppato in precedenti lavori sono state applicazioni interne sulla intranet aziendale, senza mai ricevere "traffico del mondo reale". Inoltre, nei lavori precedenti, ho sempre avuto un DBA o qualcuno che sapeva molto più di me su queste cose.

In questo nuovo lavoro che ho appena iniziato, mi è stato chiesto di sviluppare un'applicazione pubblica con un backend MySQL e si prevede che i dati memorizzati da questa applicazione crescano molto rapidamente. Oh, e non abbiamo un DBA. Bene, immagino di essere il DBA. ;)

Per quanto riguarda la progettazione di un database scalabile, non so nemmeno da dove iniziare. Qualcuno ha qualche buon consiglio o conosce qualche buon materiale didattico per uno sviluppatore che è stato inserito in un ruolo di DBA / database designer ed è stato incaricato di progettare un database scalabile per supportare un'applicazione come questa? Qualche altro sviluppatore è stato in questo modo? Che cosa hai fatto per diventare subito bravo in questo ruolo?

Ho trovato alcune buone diapositive sull'argomento qui ma è difficile raccogliere i dettagli dalle diapositive . Vorrei poter aver assistito al discorso di quel ragazzo.

Ho trovato anche un buon post di blog chiamato 5 modi per potenziare Scalabilità di MySQL che aveva alcune buone informazioni, anche se alcune erano sopra la mia testa.

tl; dr

Voglio solo assicurarmi che il database non debba essere completamente ridisegnato quando si ridimensiona e sto cercando dei suggerimenti per farlo bene la prima volta. La risposta che sto cercando è un "elenco di cose che ogni sviluppatore dovrebbe sapere di creare un database MySQL scalabile in modo che l'applicazione non funzioni come una schifezza quando i dati diventano enormi".

    
posta CFL_Jeff 23.03.2012 - 14:32
fonte

4 risposte

3

Penso che valgano le solite regole:

  • Tieni le tabelle piccole (non sprecare spazio inutilmente).
  • Non eseguire query per ottenere più informazioni del necessario.
  • Se usi gli ORM, fai attenzione alle insidie più comuni come il problema N + 1.
  • Stai lontano da operatori fastidiosi (ad es. come '% Smith%').
  • Progetta i tuoi indici in modo intelligente e assicurati che coprano la maggior parte degli usi ( qui è un computer decente, se leggero , trattamento degli indici).
  • Ricorda che l'interrogazione basata su set di solito è di gran lunga superiore in termini di prestazioni rispetto all'iterazione dei dati.
  • Scopri quando denormalizzare i dati per motivi di prestazioni.
  • Cache tutto può essere memorizzato nella cache (in modo economico) per alleggerire il DB.

Naturalmente, il ridimensionamento verticale può solo farti arrivare così lontano, e quindi potresti dover esaminare il ridimensionamento orizzontale. Detto questo, un buon design a singolo DB può ancora portarti molto lontano - per quanto ne so, StackOverflow sta ancora eseguendo una singola istanza DB. Se pensi di dover gestire molti più dati di questo, prendi in considerazione lo sharding (o i DB alternativi).

    
risposta data 23.03.2012 - 14:59
fonte
1

La scalabilità dipende in gran parte dalla progettazione dello schema del database e molto meno in base alle prestazioni del database.

Suggerirei di seguire lo scenario di creazione di uno schema di database valido.

  1. Normalizza lo schema il più possibile.
  2. Quindi, se disponi di tabelle di collegamento, duplica tutte le chiavi tramite le tabelle di destinazione.
  3. Ora - denormalizza leggermente tutte le tabelle per ottenere rapporti più rapidi.
risposta data 23.03.2012 - 15:03
fonte
1
  • Seleziona da PK quando possibile;
  • Tieni le tabelle abbastanza piccole da consentire l'inserimento di tutti gli indici nella memoria. Se questo non è possibile scheggia verticalmente. Dovrebbe essere abbastanza facile se alcuni dei tavoli sono usati raramente o mai insieme;
  • Evita JOIN s ogni volta che è possibile, ma d'altra parte non cadere in 1 + N trap ;
  • Evita SELECT * , specialmente se una qualsiasi delle colonne è un LOB (come TEXT ). I LOB sono mai memorizzati nella cache, vengono sempre recuperati dal disco rigido;
  • dispone di slave dedicati utilizzati per le query interattive e di quelli separati per query di report lente, complesse e aggregate;
  • Usa InnoDB (predefinito in MySQL corrente);
  • Utilizza gli slave per SELECT s, principale per INSERT/UPDATE/DELETE s;
  • Lotto di query simili, ad es. se si dispone di un inserto su ogni vista di pagina, non eseguire immediatamente il database, inserirlo nella cache e inserire successivamente più valori;
risposta data 23.03.2012 - 16:03
fonte
0

Ho scoperto che i valori predefiniti per MySQL sono molto, molto conservativi. Ciò significa che puoi eseguirlo fuori dalla scatola su hardware veramente vecchio, ma che è lento finché non lo configuri. Ho seguito questi passaggi (semplicemente hackerandoci sopra):

  1. Determina quale motore utilizzerai (Isam, l'impostazione predefinita, non supporta le transazioni)
  2. Passa attraverso tutte le opzioni disponibili e leggi i documenti
  3. Regola le opzioni verso l'alto il più possibile

Non tutte le opzioni sono importanti, ma questo copre la maggior parte del terreno. In secondo luogo, renditi conto che un sacco del back-end è IO vincolato dal tuo disco rigido (file tmp, lettura / scrittura di grandi blocchi di dati) quindi indirizzare la tua cartella mysql-data e /tmp a un disco SSD ha un grande incremento delle prestazioni. Questo è facilmente fatto attraverso la magia dei collegamenti simbolici.

Oh, e assicurati che lo schema DB supporti e incoraggia buone query. Riconosci che SQL è set based e dovresti usare UUID .

    
risposta data 23.03.2012 - 14:44
fonte

Leggi altre domande sui tag