2010-01-21 11 views
24

Mentre l'apprendimento mysql, ho letto che è possibile eseguire la seguente dichiarazione quando si aggiunge una colonna a una tabella mysql:L'ordine delle colonne è importante nelle tabelle MySQL?

ALTER TABLE contacts ADD email VARCHAR(60) AFTER name; 

o

ALTER TABLE contacts ADD email VARCHAR(60) FIRST; 

Quando si vorrebbe fare questo? È possibile utilizzare l'ordine delle colonne per l'ottimizzazione delle query? Longblobs dovrebbe essere l'ultima colonna per ottimizzare il consumo di spazio? O questi comandi esistono per qualche altro motivo?

+0

Non ho mai notato una differenza dal punto di vista delle prestazioni, ma non ho mai fatto un benchmark. Ho sempre pensato che fosse principalmente una cosa di usabilità, permettendomi di impostare le colonne in ordine logico, anche se torno indietro e ne aggiungo una dopo. – ceejayoz

+2

Vedere http://stackoverflow.com/questions/894522/is-there-any-reason-to-worry-about-the-column-order-in-a-table, che suggerisce che c'è un impatto sulle prestazioni. – Matchu

risposta

0

No, non dovrebbe importare. Un database normalizzato non dovrebbe avere vincoli sull'ordine delle colonne.

6

Ciò avrà comunque un impatto sull'ordine del risultato in select * from mytable.

Questo è il motivo per cui dovresti sempre nominare la colonna nell'istruzione select, ad es. select col1, col2 from mytable. Ma se sai che l'app sta utilizzando *, devi fare attenzione quando aggiungi una colonna.

Altrimenti, ordinare la colonna in modo che sia la più logica da comprendere. Se influisce sul perf, allora significa che sei già sul lato oscuro del tuning delle prestazioni del database e probabilmente hai un problema da qualche altra parte.

0

l'ordine delle colonne non ha importanza. Questa è puramente una caratteristica di convenienza. solo per permetterti di ristrutturare la tua tabella di database nel modo che preferisci dopo che è stata creata.

0

Il modello relazionale non ha alcun concetto di ordinamento di colonne all'interno di righe e nessun concetto di ordinamento di righe all'interno di tabelle.

6

La domanda non ha nulla a che fare con il modello relazionale o SQL. È una domanda sulle prestazioni.

In alcuni database, è più efficiente ordinare le colonne in modo specifico a causa del modo in cui viene eseguito l'accesso al disco. Se esiste un vantaggio significativo è anche la piattaforma specifica. Si tratta di un problema di I/O di basso livello relativo al modo in cui è progettato lo storage sottostante e al modo in cui è accessibile dal motore. I fornitori di motori proprietari generalmente forniscono queste informazioni tramite i loro dipartimenti di istruzione e formazione.

Penso che dovresti parlare con qualcuno che conosce i dettagli nitidi del modello di archiviazione e i metodi i/o per MySQL sulla tua piattaforma specifica o qualcuno che lo ha segnato sulla tua piattaforma per ottenere un risposta.

È del tutto possibile posizionarlo su disco in modo ottimizzato e nascondere quella colonna che ordina da te.

1

Ho pensato che non ha alcuna importanza in termini di prestazioni, ma in alcuni casi, quando si utilizzano gli indici.

Esempio.

ho usato join tabella:

| category_id | user_id | 

Entrambe le colonne erano unsigned int (10), e primary key (category_id, user_id) Prestare attenzione su ordine di colonne. Quando ho iniziato a selezionare da quel tavolo con where user_id = ? - le prestazioni erano basse.

Dopo aver modificato l'ordine delle colonne (reso user_id per primo) ha iniziato a selezionare tempi più rapidi.

+1

http://dev.mysql.com/doc/refman/5.6/en/multiple-column-indexes.html – NovaDenizen

+2

L'ordine delle colonne in un indice composito è importante, ma ciò non ha nulla a che fare con l'ordine delle colonne nella tabella . (Quindi, questa "risposta" non affronta la "domanda"). –

1

A "Quando si desidera utilizzare questo" anziché un problema di prestazioni.

La replica basata su riga si interrompe se l'ordine delle colonne è diverso tra master e slave ei tipi di colonna non sono compatibili (errore 1677).

contatti ALTER TABLE MODIFICARE email VARCHAR (60) DOPO il nome;

sarebbe un modo per correggere questo problema.

Problemi correlati