Allora primo aspetto. Le scritture non si parallelizzano con un'architettura master-slave, master-master o come vuoi.Originariamente inviato da Haran78
Ok, provo a riformulare:
1) il web service incriminato aggiorna un'unica tabella
Quindi se hai moltissime modifiche hai un problema, ed eventualmente devi shardare
per ordinecon vari prezzi per singolo prodotto. A complicate le cose c'e' il fatto che i prezzi cambiano di giorno in giorno. Oggi A puo' costare 5 e domani 6. Per questo motivo ogni oggetto in vendita viene ripetuto nella tabella per ogni giorno dell'anno. A complicare ulteriormente le cose, il genio che ha fatto il sistema ha definito il campo data come char (ad es. 20110707 sta per 7 luglio 2011)
La variazione non mi sembra grave.
Neppure la codifica della data
Devi essere un pochino più preciso.2) i comandi eseguiti sul database sono principalmente UPDATE, INSERT ed un mare di SELECT
perchè le select le puoi suddividere su più server, mentre update ed insert no
Serve qualcosa di più preciso.3) Server LAMP (Debian 64) con 12GB di ram
- myisam?
- innodb?
posta il my.cnf direttamente
E' un pochino troppo generico.4) quando vengono effettuati aggiornamenti dei prezzi per periodi lunghi mysql si sblocca per il troppo carico e la macchina si pianta. A volte mi tocca resettarla.
Devi verificare quali sono i processi mysql in esecuzione (ad esempio con mysqladmin processlist status), verificando il motivo per cui sono in attesa
qui serve la descrizione della tabella, cardinalità totale, e cardinalità dei raggruppamenti dei singoli campi (per decidere la selettività)ho provato ad utilizzare degli indici che mi consentissero di velocizzare gli aggiornamenti ma il risultato non e' sufficiente.
---
Riassumendo, da quanto posso "intuire", hai un problema di parallelismo del mix scritture-letture.
Va innanzitutto capito se hai tante scritture piccole, o poche grandi (esempio di poche grandi: update qualcosa set prezzo=prezzo*1.1)
Se ne hai poche e grandi conviene fare dei cicli per spezzare le insert troppo numerose in chunk, in modo da lasciar spazio per l'esecuzione concorrente di altri comando.
Se ne hai tante e piccole bisogna innanzitutto usare innodb per limitare i lock (e magari mysql 5.5 o 5.6, che scalano ancor meglio).
Poi, possibilmente, shardare logicamente o a livello applicativo le scritture
Poi bisogna configurare bene innodb.
Eventualmente modificare l'hardware.
---
Ovviamente dò per scontato l'attivazione dello slowquery, e se avete soldi da spendere e tempo da dedicare passare a mariadb o a un mysql patchato da percone per avere una risoluzione migliore sulle query.