È pratica comune mescolare le tabelle InnoDB e MyISAM sullo stesso server?


21

Ho un singolo database di circa 4,5 GB in esecuzione su un server con 8 GB di RAM. La stragrande maggioranza dei tavoli sono MyIsam (circa 4,3 GB), ma presto li convertirò in InnoDB. (Sarà un processo lento, concentrandosi inizialmente sulle tabelle più intense in scrittura).

C'è qualcosa di sbagliato nell'esecuzione di un server dedicato in cui esistono entrambi i tipi di motori di archiviazione?


Is there anything wrong with running a dedicated server where both types of storage engines exist? Forse riformulare Multiple types?
Giovanni

L'unico motivo per cui ho detto "entrambi" è perché questa domanda riguarda i due motori principali che sono configurati per essere "finemente sintonizzati". Sto cercando di ignorare altri tipi di motori come MEMORY o MERGE, che sono abbastanza rari che afaik non è l'oggetto del tuning delle prestazioni.
Derek Downey,

Risposte:


18

Non c'è niente di sbagliato nell'usare più motori di archiviazione sulla stessa macchina fisica, purché tu comprenda i pro e i contro di ciascuno. Esistono considerazioni sulle prestazioni, limitazioni delle funzionalità e casi d'uso per tutti i tipi di archiviazione dei plug-in.

Ad esempio, se hai una piccola tabella con il 90% di scritture, puoi scegliere MyISAM. Se i dati possono essere rigenerati facilmente ed è una piccola tabella, diciamo per l'accodamento, potresti scegliere Memoria. Se hai una tabella che legge il 90% e i dati devono essere lì quando la cerchi, allora probabilmente sceglieresti un motore di archiviazione che supporta transazioni e atomicità configurabile, come InnoDB. Se si desidera l'accessibilità tramite il file system senza dati dannosi, è possibile scegliere CSV.

Tuttavia, è possibile utilizzare in modo sicuro più motori di archiviazione all'interno dello stesso schema e dell'host fisico.

Vorrei sottolineare, tuttavia, che i buffer hanno un ruolo in tutto questo casino. Se usi sia MyISAM che InnoDB, dovrai fare attenzione che key_buffer e innodb_buffer_pool non contendano. Ciò richiederà un'attenta pianificazione da parte tua, ma è quello che facciamo.


4
+1 Un altro caso d'uso comune è MyISAM per le tabelle che richiedono la ricerca full-text e InnoDB per tutte le altre tabelle.
Asaph,

@Aseph: anche al momento del tuo commento, InnoDB supportava gli indici full-text .
BlueRaja - Danny Pflughoeft

2
^^^^ "Le funzionalità di MySQL 5.6" non erano GA fino al 05/02/2013
randomx,

1
@randymelder Bella risposta. Saresti in grado di approfondire ciò che intendevi con "Dovrai stare attento che il tuo key_buffer e innodb_buffer_pool non contendano"?
Neel,

1
Voglio essere smentito, ma la logica sembra opposta a questo stackoverflow.com/a/6796566/5645769 qui.
Martedì

7

Non posso dirti se questa è una pratica comune. Posso dire della mia esperienza.

Uso sempre lo strumento migliore per il lavoro, quindi mescolo sempre i motori. La maggior parte dei miei progetti utilizza MyISAM come motore predefinito.

Quando ho bisogno di funzioni speciali disponibili solo su InnoDB, ci provo.

Quando una tabella è per lo più di sola lettura, scelgo il motore di archiviazione prima di poter lampeggiare.

Sapendo che il server della macchina ha memoria sufficiente, tutti i miei dati temporanei sono memorizzati su tabelle Heap.

Ho visto in passato alcuni rallentamenti nel mescolare MyISAM e InnoDB ma questo non è un problema specifico di MySQL. È un problema di progettazione che non appare quando si utilizza un solo motore. In realtà, l'utilizzo di un motore errato provoca un rallentamento maggiore, indipendentemente dal fatto che si tratti solo di MyISAM, di InnoDB o di un mix di entrambi. È difficile definire una formula per sapere quando si verificherà il rallentamento. Solo test reali potrebbero dirtelo.

Naturalmente, non è possibile preservare l'integrità e la coerenza mescolando InnoDB e MyISAM su una query univoca.


il motore di archiviazione non supporta l'indicizzazione, quindi perché lo memorizzi in archivio.
user4951

0

Cerco di evitare di mescolare le tabelle MyISAM e InnoDB nello stesso database, ma questo è per ragioni di sanità mentale piuttosto che pratiche. Tuttavia, trovo utile disporre di un database con tabelle MyISAM per la ricerca full-text in modo da poterlo eseguire sui siti. Conservarlo in un database separato con una chiave esterna per ogni voce rende facile per tutti gli altri sviluppatori che lavorano sul DB vedere cosa sta succedendo.


Come puoi avere una chiave esterna quando usi MyISAM?
a_horse_with_no_name

Terminologia errata, ma funziona come una chiave esterna. Memorizzo il numero ID dell'elemento dalla tabella InnoDB e lo uso per fare la ricerca della pagina sul risultato della ricerca.
Kenzo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.