PROZONE powered by Tophost
  Home   Forum   Regolamento Help Login Registrati   *
Statistiche
Utenti
Utenti Totali: 1707
Ultimo utente: xal
Statistiche
Posts Totali: 29470
Topics Totali: 3404
Online Oggi: 51
Presenze Massime Online: 559
(23 Luglio 2008, 14:24:28)
Utenti Online
Utenti: 0
Visitatori: 49
Totale: 49
Siti amici
Design & Multimedia

Dire e Fare il blog che ti aiuta

Wordpress
Pagine: [1]
 
Autore Topic: Ottimizzare Mysql Per Prestazioni Migliori  (Letto 15353 volte)
effe8
Coordinatore
*
Posts: 837


Ottimizzare Mysql Per Prestazioni Migliori
« il: 4 Dicembre 2005, 19:15:51 »

Ciao a tutti, mi sono ritrovato a leggere l'eccellente POST di Dark Bard, frequentatore del forum HTML.IT all'indirizzo http://forum.html.it/forum/showthread.php?s=&threadid=290549 , e riporto integralmente anche un'aggiunta dell'utente Disa sempre presente nel thread citato.

Citazione
I passi da compiere sono fondamentalmente 3:

1)Realizzare istruzioni SQL efficaci:
le istruzioni SQL, se ben progettate, diminuiscono di molto il tempo di eseguzione della query siccome sarebbe possibile scrivere un libro intero sull'argomento, ed ognuno avrebbe la sua in proposito, vi do solo delle semplici linee guida da seguire.

L'utilizzo degli indici velocizza di molto l'eseguzione della query; per questo motivo è bene utilizzare gli indici ogni volta che è possibile

Evitare l'utilizzo di "punteggiature estranea" nelle proprie query: infatti Mysql analizza prima i segni di interpretazione estranei prima di eseguire la query, e per questo motivo l'eseguzione risulta rallentata. La punteggiatura estranea comprende, per esempio, le parentesi aggiuntive, utilizzate da molti per ordinare le query.

La parola LIMIT utilizzata nelle proprie query obbliga Mysql ad utilizzare gli indici anke quando normalmente ciò non dovrebbe avvenire.

Rendere sicuro un database è sicuramente una buona cosa, ma come sappiamo "il troppo stroppia"!!Infatti quanto maggiore è la sicurezza, tanto maggiore sarà il carico di informazioni che dovrà supportare Mysql. Un consiglio potrebbe essere quello di controllare la sicurezza a livello di PHP, e non a livello server, così da sovraccaricare meno il database.

Un ultimo accorgimento è quello di usare SELECTCOUNT(+) per il conteggio di tutte le righe di un database. Infatti questa funzione usa il numero contenuto nell'intestazione della tabella per conteggiare le righe.

2)Realizzare Tabelle più veloci:
La realizzazione di tabelle veloci ed efficenti è sicuramente il modo migliore per gestire il proprio database. Oltre al consiglio di progettare al meglio il database prima di crearlo, vi posso dare le seguenti direttive:
  • Utilizzare il tipo di dati, per un campo, il più piccolo possibile, in modo da utilizzare meno memoria e da recuperare i dati più velocemente.


Evitare di utilizzare campi NULL; piuttosto inserire un valore vuoto (che è diverso da nullo!!). In questo modo si risparmia spazio (lo so, è assucrdo che QUALCOSA occupi più-spazio di NULLA ma è così) e si velocizzano le operazioni.

Evitare l'uso di colonne a lunghezza variabile; come vediamo queste influenzano il tipo di tabella utilizzata, peggiorando le prestazioni. Se è proprio necessario, ovviamente, nn si può fare nulla!

Qui entriamo nel discorso TIPO TABELLA: esistono 3 tipi di tabelle a cui può accede chiunque (static,dynamic,heap) ed una a cui hanno accesso solo gli utenti paganti (compressed); la tabella static è quella standard, molto veloce, e viene utilizzata quando nn sono presenti campi variabili; altrimenti la tabella è convertita automaticamente in dynamic, un tipo di tabella più lento. la tabella heap è una tabella temporanea, molto veloce per tabelle di piccole dimensioni, che esiste solo in memoria. Non l'ho mai usate, anke se dovrebbe essere particolaremte utile per unioni o cose simili. Infine la tabella compressed è un tipo di tabella di sola lettura, che richiede poco spazio su disco ed è molto veloce.

I valori predefiniti, sfruttati da poche persone, sono invece molto utili durante le operazioni di insert; inquesto caso si risparmia tempo per l'analisi dell'istruzione.

Infine vi consiglio di evitare l'utilizzo di troppi indici: questi velocizzano le istruzioni di SELECT, ma rallentano INSERT ed UPDATE.

3)Reimpostare le variabili di sistema:
Qui entriamo in un discorso più specifico: le variabili di sistema di mysql possono essere impostate per migliorarne le prestazioni, sia per quanto riguarda l'affidabilità che la velocità di esguzione. Le variabili che vi elenco sono 5; ne sono presenti molte di più, ma il loro utilizzo specifico è un po com plesso, oppure sono variabili di uso facilmente comprensibile.Dicevamo:

buffers: l'incremeto di qualunque buffer permetterà di ottenere un database molto più veloce. Attenti però che un'impostazione troppo alta potrebbe creare solamente danni. Impostate quindi i buffers in base alla quantità di memoria disponibile.

Wait_timeout: rappresenta il tempo che trascorre prima che venga chiusa automaticamente una connessione a Mysql a causa dell'inattività. Abbassare il numero fa migliorare le prestazioni.

back_log: controlla quante connessioni simultanee è in grado di reggere Mysql mentre crea nuovi thread. Minore è il numero, maggiore sarà la velocità, ma la prestazione effettiva potrbbe risentirne.

Delayed_queue_size: rappresenta il numero di righe accodabili con INSERT DELAYED. Meno saranno le righe accodabili, più veloce sarà Mysql.

table_cache: controlla il numero di tabelle aperte per tutti i thread; aumentando questa variabile, aumenteranno le tabelle caricate contemporaneamente e l'esecuzione di Mysql sarà molto più veloce. Il problema in questo caso sorge dal tipo di sistema operativo, che potrebbe avere dei limiti che possono influire sui files caricati contemporaneamente.

come ultimo consiglio vi posso , in caso abbiate un vostro server, darvi quello di far funzionare Mysql sotto Linux, e di avere un pc con un buon hardware per sostenere molto più velocemente le operazioni di Mysql.

Citazione
Riprendendo il punto (2) dell´ottima pillola di Dark Bard, pensavo di parlare un po´ delle ridondanze, la cui presenza é da decidere in fase di progettazione del database.

Il problema é piú complesso di quel che potrebbe si potrebbe in un primo momento pensare.

Per ridondanza si intende una ripetizione di un´informazione, cioé inserire in una certa tabella un dato ricavabile per mezzo di query dal resto del database. Ad esempio un attributo che puó essere derivato da altri attributi della stessa tabella o di altre.

La presenza di ridondanze porta come vantaggio la semplificazione delle query e un aumento della velocitá di esecuzione.

L´inserimento di queste porta peró anche notevoli svantaggi come l´appesantimento degli aggiornamenti e un maggiore spazio occupato.

Ma quando conviene inserire una ridondanza in un database?

Prima di inserire una ridondanza all´interno del database é necessario analizzare le sue prestazioni.

I due principali indici di prestazione considerano costo delle operazioni e occupazione di memoria. Nel caso di un database (che é il caso che analizzo), il costo di un´operazione é misurato in funzione del numero di occorrenze delle tabelle e delle associazioni che le coinvolgono. Per fare questa analisi é necessario conoscere il volume di dati, cioé occorrenze e dimensioni degli attributi, e le caratteristiche delle operazioni, cioé tipo di operazione, la frequenza e i dati coinvolti.

In genere é sufficiente limitarsi ad analizzare le prestazioni delle operazioni piú frequenti.

Per desrivere il volume dei dati e le caratteristiche delle operazioni é possibile costruire la tavola dei volumi, in cui vengono riportati tutti i concetti dello schema con i volumi di accessi previsti e la tavola delle operazioni dove sono inserite i tipi di operazioni e loro frequenza.

Per facilitare l´analisi si considera solitamente un accesso in scrittura come il doppio di uno in lettura.

Quindi accedere 2 volte in lettura ad una tabella equivale ad accedere 1 volta in scrittura.

La presenza o meno di una ridondanza é quindi essenziale in termini di prestazione di un database, soprattutto se questo inizia ad avere un numero elevato di dati.
« Ultima modifica: 4 Dicembre 2005, 19:19:47 da effe8 » Loggato

euthymos
Utente
***
Posts: 123


Re: Ottimizzare Mysql Per Prestazioni Migliori
« Risposta #1 il: 8 Settembre 2007, 14:51:00 »

Grazie, ottima guida!
Loggato
m4oc
Appena Entrato
*
Posts: 2


Re: Ottimizzare Mysql Per Prestazioni Migliori
« Risposta #2 il: 12 Luglio 2008, 20:10:26 »

Volevo segnalare una caratteristica disponibile da mysql 5.1 che permette un notevole incremento delle prestazioni: il partizionamento

http://dev.mysql.com/tech-resources/articles/mysql_5.1_partitioning.html

Loggato
MySeQuoiaL
Appena Entrato
*
Posts: 3


Re: Ottimizzare Mysql Per Prestazioni Migliori
« Risposta #3 il: 10 Marzo 2009, 10:01:20 »

Interessante veramente. Vorrei solo aggiungere la questione del parametro thread_concurrency che va, a mio parere, impostato 2 volte il numero delle cpu.
Per esempio se ho un Intel Core 2 Quad, che ha 4 processori, il parametro va messo a 8.
Naturalmente per MySQL sarebbe meglio un Xeon che ha più cache.
Fonte: Ottimizzare MySQL valent
Loggato
Pagine: [1]
 
 
Salta a:  

Oggetto Iniziato da Risposte Visto Ultimo Post
Tophost: Controllo A Garanzia Delle Risorse « 1 2 » Tophost 17 10796 Ultimo Post 10 Gennaio 2007, 14:26:26
da Venticello
Limite email tonnaer 3 3390 Ultimo Post 5 Settembre 2008, 10:46:39
da Volverine
Cgi-python: La Saga Continua.. sotospeak 9 4756 Ultimo Post 24 Novembre 2005, 00:59:46
da flowolf
Tophost: Disservizi E Disservzi « 1 2 ... 5 6 » jackmoros 82 19418 Ultimo Post 30 Marzo 2007, 12:53:33
da jackmoros
E' bello essere amati II ...sull'opportunismo del genere umano « 1 2 3 4 » Tophost 54 23068 Ultimo Post 29 Agosto 2007, 13:08:25
da techtechboom
Powered by MySQL Powered by PHP Powered by SMF 1.1.8 | SMF © 2006-2008, Simple Machines LLC
Traduzione Italiana a cura di SMItalia

TinyPortal v0.9.8 © Bloc
XHTML 1.0 Valido! CSS Valido!


Ultima visita di Google a questa pagina Oggi alle 05:54:19