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

Come scegliere i tipi di dati ottimizzati per le colonne [specifico per innodb]?

Breve riepilogo:

(solo le mie opinioni)

  1. per indirizzo email - VARCHAR(255)
  2. per nome utente - VARCHAR(100) o VARCHAR(255)
  3. per id_username - usa INT (a meno che tu non preveda oltre 2 miliardi di utenti nel tuo sistema)
  4. numeri di telefono - INT o VARCHAR o forse CHAR (dipende se vuoi memorizzare la formattazione)
  5. post - TEXT
  6. date - DATE o DATETIME (includi sicuramente i tempi per cose come post o e-mail)
  7. denaro - DECIMAL(11,2)
  8. varie - vedi sotto

Per quanto riguarda l'utilizzo di InnoDB perché VARCHAR dovrebbe essere più veloce, non mi preoccuperei di questo, o della velocità in generale. Utilizzare InnoDB perché è necessario eseguire transazioni e/o si desidera utilizzare i vincoli di chiave esterna (FK) per l'integrità dei dati. Inoltre, InnoDB utilizza il blocco a livello di riga mentre MyISAM utilizza solo il blocco a livello di tabella. Pertanto, InnoDB può gestire livelli di concorrenza più elevati meglio di MyISAM. Usa MyISAM per usare indici full-text e per un sovraccarico leggermente inferiore.

Ancora più importante per la velocità rispetto al tipo di motore:metti gli indici nelle colonne su cui devi cercare rapidamente. Inserisci sempre gli indici nelle colonne ID/PK, come l'id_username che ho menzionato.

Maggiori dettagli:

Ecco una serie di domande sui tipi di dati MySQL e sulla progettazione del database (attenzione, più di quanto hai chiesto):

E un paio di domande su quando utilizzare il motore InnoDB:

Uso solo tinyint per quasi tutto (seriamente).

Modifica - Come archiviare i "post:"

Di seguito sono riportati alcuni collegamenti con maggiori dettagli, ma ecco la versione breve. Per archiviare i "post", è necessario spazio per una lunga stringa di testo. CHAR la lunghezza massima è 255, quindi non è un'opzione e ovviamente CHAR sprecherebbe caratteri inutilizzati rispetto a VARCHAR , che è di lunghezza variabile CHAR .

Prima di MySQL 5.0.3, VARCHAR la lunghezza massima era 255, quindi saresti rimasto con TEXT . Tuttavia, nelle versioni più recenti di MySQL, puoi usare VARCHAR o TEXT . La scelta si riduce alle preferenze, ma ci sono un paio di differenze. VARCHAR e TEXT la lunghezza massima ora è 65.535, ma puoi impostare il tuo massimo su VARCHAR . Diciamo che pensi che i tuoi post dovranno essere al massimo 2000, puoi impostare VARCHAR(2000) . Se raggiungi il limite, puoi ALTER tabella in un secondo momento e invialo a VARCHAR(3000) . D'altra parte, TEXT memorizza effettivamente i suoi dati in un BLOB (1). Ho sentito che potrebbero esserci differenze di prestazioni tra VARCHAR e TEXT , ma non ho visto alcuna prova, quindi potresti voler approfondire la questione, ma puoi sempre modificare quel piccolo dettaglio in futuro.

Ancora più importante, cercare in questa colonna "post" utilizzando un indice full-text invece di LIKE sarebbe molto più veloce (2). Tuttavia, devi utilizzare il motore MyISAM per utilizzare l'indice full-text perché InnoDB non lo supporta . In un database MySQL, puoi avere un mix eterogeneo di motori per ogni tabella, quindi dovresti solo fare in modo che la tua tabella "post" utilizzi MyISAM. Tuttavia, se hai assolutamente bisogno di "post" per usare InnoDB (per le transazioni), imposta un trigger per aggiornare la copia MyISAM della tua tabella "post" e usa la copia MyISAM per tutte le tue ricerche full-text.

Vedi in fondo alcune citazioni utili.

Infine, ecco un ottimo post sui pro ei contro di VARCHAR rispetto a TEXT. Parla anche del problema delle prestazioni: