2009-07-04 13 views
11

Sono piuttosto confuso dal feroce mercante here.Quando dovresti scegliere di usare InnoDB in MySQL?

So come fare, vedere sotto, ma non ho idea del perché? A cosa servono?

create table orders (order_no int not null auto_increment, FK_cust_no int not null, 
foreign key(FK_cust_no) references customer(cust_no), primary key(order_no)) type=InnoDB; 


create table orders (order_no int not null auto_increment, FK_cust_no int not null, 
foreign key(FK_cust_no) references customer(cust_no), primary key(order_no)); 
+1

vostro esempio sta facendo chiavi esterne, non InnoDB. Avresti dovuto chiedere quali sono le chiavi esterne. –

+1

Che "offensivo"? Questo articolo riguarda come recuperare da un DATABASE DROP involontario. –

+0

Jim Ferrans: Mi riferivo alla frase: "se non sei un programmatore con grande esperienza, farai del male". –

risposta

16

InnoDB è un storage engine in MySQL. Ce ne sono alcuni, e tutti hanno i loro pro e contro. I principali punti di forza di InnoDB sono:

  • Supporto per transazioni (supporto per la proprietà ACID).
  • Blocco a livello di riga. Avere un meccanismo di bloccaggio a grana più fine offre una maggiore concorrenza rispetto, ad esempio, a MyISAM.
  • Vincoli chiave esterna. Permettendo al database di garantire l'integrità dello stato del database e le relazioni tra le tabelle.
2

Everywhere! Deprecate myisam, innodb è la strada da percorrere. Non si tratta solo di prestazioni, ma integrità dei dati e transazioni acide.

+0

Le transazioni ACID non sono sempre necessarie, quindi in molti casi MyISAM è molto buono. Esistono diverse soluzioni per diversi problemi. – Nin

2

Nel tuo esempio, crei chiavi esterne. Le chiavi esterne sono supportate solo per le tabelle InnoDB, non per le tabelle MyISAM.

2

Potrebbe essere interessato a this article dal diario di database che discute il tipo di tabella InnoDB in MySQL.

Estratto:

Il mese scorso abbiamo visto il tipo di tabella HEAP , un tipo di tabella che corre interamente in memoria. Questo mese guardiamo allo impostando il tipo di tabella InnoDB, il tipo di maggior interesse per gli utenti seriamente . Il tipo di tabella standard MyISAM è ideale per l'utilizzo del sito Web, dove ci sono molte letture rispetto alle scritture e nessuna transazione. Dove queste condizioni non si applicano (e oltre ai siti Web, esse non si applicano spesso nel mondo del database), la tabella InnoDB è probabile che sia il tipo di tabella di scelta. Questo articolo è indirizzato allo agli utenti che hanno familiarità con MySQL, ma hanno utilizzato solo il tipo di tabella MyISAM predefinito.

Non vorrei essere scoraggiato dall'altra domanda. Tieni i backup corretti del tuo database, di qualsiasi tipo - e non far cadere i tavoli per sbaglio ;-) - e starai bene qualunque tipo di tabella tu scelga.

+0

+1 per l'articolo e i backup –

1

In generale per me il punto più importante è che InnoDB offre il blocco per riga, mentre MyISAM appare per tabella. Su tavoli di grandi dimensioni con molte scritture questo potrebbe essere un grosso problema di prestazioni.

D'altra parte la tabella MyISAM ha una struttura di file più semplice, la copia e la riparazione della tabella a livello di file è molto più semplice.

+0

+1 per prospettiva personale –

+0

Quanto è considerato molto? una scrittura al secondo è molto? –

+0

@EvanLee Dipende :) Specialmente quanti dati si scrivono, rispettivamente quanto tempo impiega l'operazione di scrittura. Ma in generale: No! – leo

12

Sempre. A meno che non sia necessario utilizzare la ricerca full-text di MySQL o InnoDB è disabilitato nel tuo webhost condiviso.

+0

questa è la risposta più semplice ed è vera! – JohnB

+1

FYI InnoDB ora supporta la ricerca full-text. Inoltre, InnoDB è molto più veloce di un tempo. Quindi, raramente v'è alcuna ragione per usare MyISAM più * (che è il motivo per cui InnoDB è ora il motore di default in MySQL) * –

0

Un supplemento Machine e la risposta s' knoopx sulle transazioni:

Il MySQL tipo di tabella di default, MyISAM, non supporta transazioni. BerkeleyDB e InnoDB sono i tipi di tabelle sicuri per le transazioni disponibili in MySQL open source, versione 3.23.34 e successive.

La definizione della transazione e un esempio bancario

Una transazione è una sequenza di singole operazioni di database che sono raggruppati insieme. - Un buon esempio in cui le transazioni sono utili è nel settore bancario.

Source of the citations

1

Un commento ha un comando per convertire i database di InnoDB here.

3

Penso che si sono confusi su due questioni diverse, quando usare InnoDB invece di MyISAM, e quando usare estera chiave (FK).

Per quanto riguarda il primo numero, ci sono state molte risposte che fanno un ottimo lavoro per spiegare le differenze tra MyISAM e InnoDB. Mi limiterò a ripetere che, nella citazione di tvanfosson da un articolo, MyISAM è più adatto per sistemi con letture per lo più. Questo perché utilizza il blocco a livello di tabella anziché a livello di riga come InnoDB, quindi MyISAM non è in grado di gestire una concorrenza elevata, inoltre mancano funzionalità che aiutano l'integrità dei dati come transazioni e chiavi esterne (di nuovo, già menzionate da altri).

Non è necessario utilizzare i vincoli FK nel modello dati. Se sai quali sono le relazioni tra i tuoi tavoli e la tua applicazione è priva di bug, ti ritroverai senza FK. Tuttavia, l'utilizzo di FK garantisce un'assicurazione aggiuntiva a livello di database, in quanto MySQL non consente all'applicazione di inserire dati non validi in base ai vincoli creati.

Nel caso in cui non sono chiare su perché utilizzare chiavi primarie (PK), facendo una colonna come id_order per esempio PK della tabella orders significa che MySQL non INSERT lascerà lo stesso valore di id_order più di una volta perché ogni riga in una colonna PK deve essere unica.

Un FK verrebbe utilizzato su una tabella che ha una dipendenza su un'altra tabella, ad esempio, order_items avrebbe una dipendenza su orders (sotto). id_order_items è la PK di order_items e si potrebbe fare id_order_items l'FK del tavolo orders di stabilire una relazione uno-a-molti tra orders e order_items. Allo stesso modo, id_item potrebbe essere un FK nella tabella order_items e un PK nella tabella items per stabilire una relazione uno-a-molti tra order_items e items.

** Allora, che il vincolo di FK fa è impedire di aggiungere un id_item value to the order_items table that isn't in the articoli table, or from adding a id_order_items to ordini that isn't in the order_items `tabella.

Tutto ciò che un FK fa è assicurare l'integrità dei dati e aiuta anche a comunicare le relazioni tra le tabelle con altri sviluppatori che non hanno scritto il sistema (e te stesso mesi dopo quando dimentichi!), Ma principalmente per l'integrità dei dati. **

credito extra: così perché uso le transazioni? Beh, hai già menzionato una citazione che dice che sono utili per il sistema bancario, ma sono utili in un numero di situazioni superiore a quello.

Fondamentalmente, in un database relazionale, in particolare se si tratta di normalized, un'operazione di routine come l'aggiunta di un ordine, l'aggiornamento di un ordine o l'eliminazione di un ordine spesso sfiora più di una tabella e/o coinvolge più di un'istruzione SQL. Potresti anche finire a toccare la stessa tabella più volte (come nell'esempio qui sotto). Btw Data Manipulation Language (DML) (INSERT/UPDATE/DELETE) coinvolgono solo una tabella alla volta.

Un esempio di aggiunta di un ordine:

vi consiglio una tabella orders e una tabella order_items. Ciò che lo rende così può si può avere un PK sul id_order nella tabella orders, il che significa id_order non può essere ripetuta in orders. Senza il 1-a-molti orders - rapporto order_items, che avrebbe dovuto avere più righe nella tabella orders per ogni ordine che ha avuto più elementi ad esso associati (avete bisogno di un tavolo items troppo per questo sistema di e-commerce btw). Questo esempio aggiungerà un ordine e toccherà 2 tabelle in questo modo con 4 diverse dichiarazioni INSERT.

(vincoli chiave per scopo illustrativo)

-- insert #1 
INSERT INTO orders (id_order, id_order_items, id_customer) 
VALUES (100, 150, 1) 

-- insert #2 
INSERT INTO order_items (id_order_items, id_item) 
VALUES (4, 1) 

-- insert #3 
INSERT INTO order_items (id_order_items, id_item) 
VALUES (4, 2) 

-- insert #4 
INSERT INTO order_items (id_order_items, id_item) 
VALUES (4, 3)

Che importa se l'inserto # 1 e inserto # 2 query vengono completate correttamente, ma il inserto # 3 dichiarazione non ha ? Si finirebbe con un ordine in cui mancava un articolo, e si tratterebbe di dati inutili. Se in quel caso, si vuole far ritirare tutte le query in modo che il database è nello stesso stato in cui era prima di aggiungere l'ordine e poi ricominciare da capo, bene che è esattamente ciò che le transazioni sono per. ** Raggruppa le query che vuoi siano eseguite tutte o in caso di eccezione, quindi nessuna, in una transazione.

Così come vincoli PK/FK, le transazioni contribuire a garantire l'integrità dei dati **

+0

aggiungendo 1 per opporsi InnoDB per MyISAM, quando noi non è sufficiente sapere MySQL e InnoDB, non possiamo che ci sono molti motori. – pdem

2

InnoDB:.

Il motore di archiviazione InnoDB in MySQL. InnoDB è un motore di archiviazione ad alta affidabilità e prestazioni elevate per MySQL.I vantaggi principali di InnoDB includono:

  • Il design segue il modello ACID, con transazioni con funzioni di commit, rollback e ripristino di emergenza per proteggere i dati dell'utente.
  • blocco a livello di riga (senza rivolgersi a più grossolana serrature granularità) e Oracle in stile coerente legge aumento della concorrenza multi-utente e le prestazioni.
  • Le tabelle InnoDB organizzano i dati su disco per ottimizzare le query comuni in base alle chiavi primarie. Ogni tabella InnoDB ha un indice chiave primaria chiamata l'indice cluster che organizza i dati per ridurre al minimo I/O per le ricerche della chiave primaria
  • per mantenere l'integrità dei dati, InnoDB supporta anche chiave esterna vincoli di integrità referenziale.
  • È possibile combinare liberamente tabelle InnoDB con tabelle di altri motori di archiviazione MySQL, anche all'interno della stessa istruzione. Ad esempio, è possibile utilizzare un'operazione di unione per combinare i dati delle tabelle InnoDB e MEMORY in una singola query.

InnoDB Limitazioni:

  • No piena di indicizzazione di testo (sotto-5.6 versione di MySQL)

  • non possono essere compressi per un veloce, di sola lettura

Altri dettagli:

consultare questo link

Problemi correlati