Abbiamo riscontrato un problema dopo aver spostato il database dei nostri clienti su un server aggiuntivo. Ciò avrebbe dovuto avere effetti positivi sulle prestazioni del sito, ma si è verificato un problema con il blocco delle tabelle in MyISAM. (Ho sentito di usare InnoDB invece di MyISAM, ma non possiamo cambiare il motore nel prossimo futuro).
Potremmo individuarlo in una query di aggiornamento che viene eseguita quando un moderatore attiva un commento sul sito. Questo è il processo:
- la query di aggiornamento viene elaborata
SET status = 1 WHERE id = 5
(l'indice è impostato) - i file memorizzati nella cache della pagina vengono eliminati
A questo punto l'intera pagina diventa lenta. Il database stesso è occupato per minuti. Ho recuperato l'elenco dei processi alcune volte e ho visto circa 60 voci di diverse query di selezione, tutte in attesa dello stato di blocco a livello di tabella .
1. Non capisco perché questo aggiornamento sulla tabella article_comments
possa influenzare le istruzioni select per la tabella article
in attesa del blocco a livello di tabella. Nella processlist quasi tutte le query in attesa provenivano da questa tabella. Ho letto del fatto che gli aggiornamenti / inserimenti sono preferiti alle selezioni e che ciò può causare tali problemi, ma la stessa tabella degli articoli non viene aggiornata quando i commenti vengono attivati, quindi le selezioni non dovrebbero attendere. L'ho sbagliato?
2. C'è qualcosa oltre a passare a InnoDB per prevenire questo comportamento o almeno per ottenere un migliore equilibrio? Sono molto irritato dal fatto che questo problema non si sia verificato prima di spostare il database sul nuovo server. Immagino che ci sia qualche configurazione errata ma non so come identificarmi.
key_buffer_size
era impostato su 1GB
. Aumentando quello per 10GB
ridurre il problema.