Mysql
 sql >> Database >  >> RDS >> Mysql

Il miglior strumento di ottimizzazione delle prestazioni di MySQL?

La cattiva notizia:ci sono strumenti GUI per aiutare con questo, ma è un lavoro qualificato e ad ampio raggio. Quindi non coprono tutto, è probabile che tu debba usare roba da riga di comando/dichiarazioni sql ecc. per aiutare. Ho usato davvero solo gli strumenti della riga di comando. Darò una piccola panoramica delle cose che conosco/ho usato:

Innanzitutto, è necessario un buon design del database. Se il design è scadente, puoi arrivare solo fino a questo punto. Ciò include la normalizzazione e l'utilizzo di tipi appropriati per i campi. Lascio questo punto qui, perché penso che sia un po' da parte, e non quello che stai cercando.

Assicurati che MySQL Query Cache sia impostato e funzionante e forniscigli un po' più di RAM se puoi, e assicurati che le tue query importanti non stiano facendo nulla che impedisca la loro memorizzazione nella cache di MySQL. Ad esempio, l'utilizzo della funzione NOW() nelle query fa questo, per ovvi motivi, NOW cambia ogni secondo! Puoi invece inserire un timestamp in sql e utilizzare l'ora al minuto/ora/giorno più vicino (il periodo più lungo con cui puoi farla franca) per consentire a mysql di ottenere qualche vantaggio di memorizzazione nella cache.

Per iniziare a ottimizzare le cose:attaccare "EXPLAIN" davanti a select è IL modo per vedere come viene eseguita una query e identificare come migliorarla. Impara a interpretare l'output:http://dev.mysql .com/doc/refman/5.0/en/using-explain.html Sarai spesso in grado di aggiungere nuovi indici/aggiungere colonne a quelli esistenti per migliorare le cose. Ma incontrerai anche momenti in cui è necessario ristrutturare le query.

Iniziare a migliorare le prestazioni con MySQL (supponendo che tu non sappia già quale sia la query problematica) è controllare il registro delle query lente:registra in un file tutte le query che richiedono più di x secondi.

La panoramica, inclusa la configurazione per se non è già stata registrata, è qui:http://dev.mysql.com/doc/refman/5.0/en/slow-query-log.html - Ho anche scoperto che impostare long_query_time su 0 per un giorno circa, in modo che tutte le query vengano registrate qui con il tempo impiegato, è un modo utile per avere un'idea di dove stanno andando le prestazioni. Ma non ci andrei subito! E non lasciarlo acceso, i registri possono diventare enormi.

Dopo alcuni giorni di registrazione, ho trovato mysqlsla (analizzatore di log lenti mysql) da qui:http://hackmysql.com/mysqlsla è un buon strumento.

Può fare molto di più che una lenta analisi del registro delle query:leggi il manuale. Ma per spiegare cosa fa per i log lenti:il log delle query lente può contenere molti dati, quindi può essere difficile capire quali query sono complessivamente più costose, ad esempio:calcola quante volte vengono eseguite e quando due query sono in realtà gli stessi con un ID diverso in una clausola where.

MySQL sla fa tutto questo per te. Viene eseguito attraverso il registro e può raggruppare query che sono uguali/hanno valori diversi nelle clausole where. Quindi ti presenta (per impostazione predefinita) le prime 10 query in termini di tempo di esecuzione totale - che spesso ha alcune sorprese, ma di solito è il punto di partenza più produttivo - prendi la query più costosa e usa EXPLAIN su di essa e vedi se puoi migliorare esso.

Alcune query richiedono molto tempo e non possono essere migliorate facilmente. In questo caso, puoi ottenere i dati in un altro modo o almeno memorizzarli nella cache? Potresti anche scoprire che è necessaria la modifica dello schema del database. Allo stesso modo, alcune query potrebbero trovarsi nella parte superiore dell'output di mysqlsla perché le esegui molto (soprattutto se long_query_time è impostato su 0), anche se vengono eseguite abbastanza velocemente. Forse è il momento di aggiungere un po' di cache alla tua app?

http://www.maatkit.org/ sembra anche promettente:non l'ho mai usato, ma lo strumento mk-query-profiler dovrebbe essere utile per approfondire il motivo per cui le query sono lente.

Anche una cosa completamente separata da guardare:la pagina "stato" in PHPMYADMIN (o puoi eseguire tutte le query per generare queste informazioni ....) - evidenzia in rosso le cose che ritiene potrebbero essere cattive e può aiutarti guarda dove potresti trarre vantaggio dall'allocazione delle risorse di sistema. Non ne so molto su questo - il mio approccio è sempre stato che se qualcosa è rosso e sembra brutto, andare a leggerlo e decidere se è importante e se dovrei fare qualcosa (di solito significa allocare più risorse a MySQL modificando la configurazione).

Recentemente ho scoperto che l'esecuzione di SHOW PROCESSLIST può essere utile anche su un server che soffre. Sebbene ti dia solo informazioni dal vivo (beh, un'istantanea dal vivo), può aiutarti a farti un'idea di cosa sta succedendo in un dato momento, specialmente se aggiorni alcune volte e osservi i cambiamenti. Di recente ho individuato un server che utilizza ogni connessione MySQL disponibile per eseguire una query identica utilizzando questo metodo. Certo, sarebbe stato nel registro delle query lente, ma questo è un modo davvero rapido e ovvio per vedere cosa stava succedendo.