L'utilizzo massimo della memoria da parte di MySQL dipende molto dall'hardware, dalle impostazioni e dal database stesso.
Hardware
L'hardware è la parte più ovvia. Maggiore è la RAM, più veloci sono i dischi ftw . Non credere a quelle lettere di notizie mensili o settimanali però. MySQL non è scalabile in modo lineare, nemmeno su hardware Oracle. È un po 'più complicato di così.
La linea di fondo è: non esiste una regola generale per ciò che è consigliato per la tua configurazione MySQL. Tutto dipende dall'uso corrente o dalle proiezioni.
Impostazioni e database
MySQL offre innumerevoli variabili e interruttori per ottimizzarne il comportamento. Se si verificano problemi, è davvero necessario sedersi e leggere il manuale (f'ing).
Per quanto riguarda il database, alcuni importanti vincoli:
- motore di tabella (
InnoDB
, MyISAM
, ...)
- taglia
- indici
- uso
La maggior parte dei suggerimenti MySQL su stackoverflow ti parlerà delle 5-8 cosiddette impostazioni importanti. Prima di tutto, non tutte hanno importanza, ad esempio allocare molte risorse a InnoDB e non usare InnoDB non ha molto senso perché quelle risorse vengono sprecate.
Oppure - molte persone suggeriscono di aumentare la max_connection
variabile - beh, poco sanno che implica anche che MySQL allocherà più risorse per soddisfare quelle max_connections
- se mai necessario. La soluzione più ovvia potrebbe essere chiudere la connessione al database nel tuo DBAL o abbassare il wait_timeout
per liberare quei thread.
Se capisci la mia idea, c'è davvero molto, molto da leggere e da imparare.
motori
I motori di tabella sono una decisione piuttosto importante, molte persone se ne dimenticano all'inizio e poi improvvisamente si trovano a combattere con un MyISAM
tavolo da 30 GB che blocca e blocca l'intera applicazione.
Non intendo dire che MyISAM fa schifo , ma InnoDB
può essere ottimizzato per rispondere quasi o quasi alla stessa velocità MyISAM
e offre qualcosa come il blocco delle righe UPDATE
mentre MyISAM
blocca l'intera tabella quando viene scritto.
Se sei libero di eseguire MySQL sulla tua infrastruttura, potresti anche voler controllare il server percona perché tra i molti contributi di aziende come Facebook e Google (che sanno velocemente), include anche il drop di Percona- in sostituzione di InnoDB
, chiamato XtraDB
.
Vedi la mia sintesi per l'installazione di percona-server (e -client) (su Ubuntu): http://gist.github.com/637669
Taglia
La dimensione del database è molto, molto importante: che tu ci creda o no, la maggior parte delle persone su Intarweb non ha mai gestito un'installazione MySQL di grandi dimensioni e di scrittura, ma quelle esistono davvero. Alcune persone trolleranno e diranno qualcosa del tipo "Usa PostgreSQL !!! 111", ma per ora ignoriamole.
La linea di fondo è: a giudicare dalle dimensioni, la decisione sull'hardware deve essere presa. Non puoi davvero far funzionare velocemente un database da 80 GB su 1 GB di RAM.
Indici
Non è: più siamo, meglio è. Devono essere impostati solo gli indici necessari e deve essere verificato l'utilizzo EXPLAIN
. Aggiungete a ciò che MySQL EXPLAIN
è davvero limitato, ma è un inizio.
Configurazioni suggerite
Riguardo a questi my-large.cnf
e ai my-medium.cnf
file, non so nemmeno per chi siano stati scritti. Rotola il tuo.
Primer per l'accordatura
Un ottimo inizio è il manuale di messa a punto . È uno script bash (suggerimento: avrai bisogno di Linux) che prende l'output di SHOW VARIABLES
e SHOW STATUS
e lo racchiude in una raccomandazione, si spera utile. Se il tuo server ha funzionato per un po 'di tempo, la raccomandazione sarà migliore poiché ci saranno dati su cui basarli.
Il primer per l'accordatura non è però una salsa magica. Dovresti comunque documentarti su tutte le variabili che suggerisce di cambiare.
Lettura
Mi piace molto consigliare mysqlperformanceblog . È un'ottima risorsa per tutti i tipi di suggerimenti relativi a MySQL. E non è solo MySQL, sanno anche molto sull'hardware giusto o consigliano configurazioni per AWS, ecc. Questi ragazzi hanno anni e anni di esperienza.
Un'altra grande risorsa è planet-mysql , ovviamente.