Archivio della categoria ‘MySQL’

8 consigli e trucchi sql per ottimizzare e rendere performante un Database

Nella maggior parte di siti e blog, costruiti o meno su un CMS, i contenuti sono memorizzati in un database. Tutte le richieste-utente, pertanto, coinvolgono un DB che dovrà essere il più performante possibile al fine di velocizzare i tempi di risposta e fornire le informazioni richieste nel modo più veloce possibile.

Ci sono, senza dubbio, alcune accortezze e alcune modalità specifiche da mettere in pratica per realizzare quanto detto. Inoltre, sono diversi gli errori che si commettono sia nella progettazione del database e sia nelle varie interrogazioni fatte al db stesso tramite query.

In questo articolo volevo evidenziare alcune possibili strade da percorrere per realizzare un database performante con cui interagire in modo ottimale.

Progettazione

Si tratta del primo passo a tutti gli effetti : la progettazione e realizzazione del database. Questo caso non coinvolge applicazioni e siti che si appoggiano ad una piattaforma (come Wordpress, ad esempio) dove tutto il db è già costruito e strutturato.

Ma per tutti gli altri casi in cui occorre progettare da zero la struttura dati, vi sono regole ben precise da seguire e, soprattutto errori evidenti e deleteri da non commettere.

A tal riguardo, vi consiglio di leggere questo articolo che riguarda proprio come approcciare il design di un database.

Conoscere in dettaglio la Query

Per ottimizzare una specifica query, è fondamentale sapere in dettaglio cosa ci restituirà quella query al fine di discernere il superfluo dall’utile.

Utilizzando lo statement EXPLAIN otterrete molte utili informazioni sulla query eseguita. Ecco un esempio di codice sql :

EXPLAIN SELECT * FROM ref_table,other_table WHERE  ref_table.key_column=other_table.column;

Per maggiori info su come utilizzare Explain, leggete la guida ufficiale mysql al riguardo.

Query e Cache

Come sapete, ogni richiesta effettuata al db per ottenere dati si risolve in una richiesta di risorse al server che lo ospita. Questo significa che un sistema di cache queries, laddove possibile, porta effettivamente vantaggi in termini di prestazione. Vediamo tre possibili scelte :

  • AdoDB : sta per Active Data Objects DataBase ed è una libreria che fornisce un’unica API per interfacciarsi ad uno dei DBMS supportati (MySQL, PostgreSQL, Interbase, Firebird, Informix, Oracle, MS SQL, Foxpro, Access, ADO, Sybase, FrontBase, DB2, SAP DB, SQLite, Netezza, LDAP. AdoDB fornisce, tra le altre cose, anche un potente caching system.
  • Memcached : Memcached annovera un sistema di caching utilizzato laddove si interagisce con database molto carichi di dati per alleggerirne il compito
  • CSQL Cache : è una infrastruttura open-source di data caching. Da quello che si legge al riguardo, sembra davvero molto affidabile.

Select Mirate

Si tratta, in pratica, di un errore comune, ma facilmente risolvibile. Una select del tipo :

SELECT * FROM wp_posts;

effettuata su una tabella wordpress (quella dei post, si capisce) ha senso solo se davvero vi occorrono tutti i dati di quella tabella. Ma se così non fosse, occorre filtrare a monte evitando di sprecare risorse inutili :

SELECT title, excerpt, author FROM wp_posts;

Questa potrebbe essere la select corretta qualora vi occorressero titolo,excerpt e autore dei post.

Usare LIMIT

Spesso, quello di cui abbiamo bisogno sono solo un numero limitato di records prelevati dal nostro database. Mi vengono in mente tutte quelle situazioni su Wordpress in cui, ad esempio, vogliamo solo mostrare ad esempio 10 post per pagina e simili. In tal caso, quindi, non ha senso estrarre tutti i record, ma utilizzando il parametro LIMIT possiamo selezionare solo il numero di records desiderato :

SELECT title, excerpt, author FROM wp_posts LIMIT 10;

Usare JOIN al posto delle sottoqueries

Troppo spesso si nota un abuso,da parte di alcuni programmatori, di subqueries. Potendo, l’ideale sarebbe non andarsi a complicare la vita con questo metodo, ma ricorrere al JOIN con cui ottenere, in modo più pulito, gli stessi identici risultati :

SELECT a.id,
    (SELECT MAX(created)
    FROM posts
    WHERE author_id = a.id)
AS latest_post FROM authors a

Questa select, sfruttado il JOIN, diventerebbe :

SELECT a.id, MAX(p.created) AS latest_post
FROM authors a
INNER JOIN  posts p
ON (a.id = p.author_id)
GROUP BY a.id

Usare UNION al posto di OR

Lo statement UNION consente di combinare il result sets di 2 o più select queries. A differenza dell’OR, permette esecuzioni nettamente più veloci.

SELECT * FROM a, b WHERE a.p = b.q or a.x = b.y;

diventa semplicemente :

SELECT * FROM a, b WHERE a.p = b.q
UNION
SELECT * FROM a, b WHERE a.x =  b.y

Usare Indici

Gli indici di un database sono simili a quelli di una libreria perché consentono di trovare le informazioni richieste in modo più rapido e, quindi, più performante.
Un indice può esser creato per una singola colonna o su più colonne in una tabella. Eccovi un esempio banale in cui si crea l’indice idModello sulla colonna Modello della Tabella Prodotto.

CREATE INDEX idModello ON Prodotto (Modello);

Fonte : Catswhocode

AeroSQL : ottimo manager MySQL Web Based

AeroSQL è un’applicazione opensource per la gestione di database MySQL. Consente di controllare e gestire simultaneamente database su diversi servers  il tutto grazie ad una singola interfaccia stile desktop molto intuitiva e semplice.

I vari record possono essere consultati o editati in un a griglia classica. Possibile lanciare ed eseguire anche in batch le queries sql per risparmiare tempo.

Il tool è costruito in PHP e richiede l’installazione delle librerie ExtJS per la funzionalità stile desktop.

Eccovi un video-presentazione molto interessante sullo strumento :

Client MySQL : 4 ottime alternative a phpMyAdmin per gestire il vostro database

E’ indiscutibile il fatto che phpMyAdmin sia il client MySQL più utilizzato e famoso nel mondo dagli sviluppatori per tutta una serie di motivi. Su tutti, di sicuro, il fatto che sia un client davvero user-friendly e, quindi, a portata di tutti.
Ma non è il solo. Ed ecco, allora, 4 ottime e altrettanto valide alternative da non sottovalutare e da considerare qualora vogliate provare un nuovo client.
La breve descrizione che accompagna ogni client vi dovrebbe indirizzare nella scelta.
Tool Navicat MySQL Client Client MySQL : 4 ottime alternative a phpMyAdmin per gestire il vostro database
Strumento che permette di amministrare e sviluppare database MySQL in modo davvero molto simile al phpMyAdmin. Interfaccia snella e pratica. Tra le principali caratteristiche del programma:
  • supporto connessioni multiple;
  • utilizzo connessioni SSL;
  • gestione privilegi utente;
  • backup e restore dei DB;
  • trasferimento dati;
  • supporto Unicode;
  • importazione ed esportazione dei dati;
  • sincronizzazione dati e strutture.
sequel pro Client MySQL : 4 ottime alternative a phpMyAdmin per gestire il vostro database
Per utenti Mac, credo sia la migliore applicazione per gestire database MySQL. Funziona sia in locale che in rete, permette di impostare anche tunnel ssh con cui collegarsi. È molto stabile e, in con una interfaccia grafica molto accattivante consente di gestire la struttura delle tabelle e del database. Inoltre, l’editor delle query consente l’auto completamento in modo da non perdere tempo e rischiare banali errori.

SQL Wave

sqlwave Client MySQL : 4 ottime alternative a phpMyAdmin per gestire il vostro database
SQLWave è un tool molto potente del GUI di MySQL che serve ad automatizzare e facilitare il processo di sviluppo della base di dati.
Alcune caratteristiche fondamentali:
  • completamente MySQL 5.x-6.x compliant;
  • interfaccia intuitiva del GUI;
  • recupero molto veloce dei dati;
  • gestione di proprietà avanzate della tabella;
  • supporta i multilingua;
  • importazione ed esportazione dei dati;
dbdesigner4 Client MySQL : 4 ottime alternative a phpMyAdmin per gestire il vostro database
DBDesigner 4 è un sistema di disegno visivo della base di dati che integra il disegno di base di dati, la modellistica, la creazione e la manutenzione in un singolo, ambiente senza giunte.
Mette a disposizione sia funzionalità professionali, sia un’interfaccia di utente semplice e comoda che consente una gestione davvero pratica. DBDesigner è un progetto assolutamente Open Source disponibile per piattaforme Microsoft Windows 2k/XP, Linux KDE / Gnome.

PHP- Connettersi ad un database MySQL. Seconda parte

php mysql connessione1 PHP  Connettersi ad un database MySQL. Seconda parte

La seconda parte del post pubblicato lunedì scorso, come molti di voi avranna intuito, riguarda l’operazione contraria a quella che prevede l’apertura di una connessione a MySQL e cioè la sua chiusura.

Come nel caso precedente, anche in questo ambito, PHP mette a disposizione una funzione nativa : mysql_close().

Va precisato che chiuderea una connessione è una procedura davvero importante perché consente al sistema di liberare risorse utili. Di norma, una connessione viene chiusa in automatico non appena finisce l’esecuzione dello script che la invoca, ma è sempre bene utilizzare la funzione suddetta per evitare problemi o inutili sprechi di risorse.

La funzione restituisce TRUE nel caso in cui la chiusura della connessione abbia successo, altrimenti restituisce FALSE quando si verifica un errore o qualsiasi avvenimento che non consente la chiusura della connessione che le viene passata come parametre. Se la funzione non riceve alcun parametro, allora provvede a chiudere l’ultima connessione aperta in ordine di tempo.

Anche in tale situazione, è bene introdurre una funzione ad hoc in una classe (magari la stessa MysqlConnect  ) :


// funzione per la chiusura della connessione
public function disconnetti()
{
if($this->attiva)
{
if(mysql_close())
{
$this->attiva = false;
return true;
}else{
return false;
}
}
}

Analizzando il codice qui sopra :

  • è stata definita una funzione chiamata disconnetti() per chiudere eventuali connessioni attive;
  • la funzione effettua, in primis, un controllo per verificare se è presente una connessione attiva;
  • nel caso in cui sia stata aperta una connessione verrà allora richiamata la funzione mysql_close() per la sua chiusura;
  • la funzione prevede, come detto, TRUE nel caso in cui la connessione sia stata chiusa con successo, FALSE in caso contrario.

E’ abbastanza logico e sconotato che l’utilizzo della funzione per la disconnessione è subordinato al fatto che non è più necessario che l’applicazione mantenga un contatto aperto con MySQL.
Anche in questo caso, ragionando con la classe presentata nel post relativo alla prima parte, la chiamata alla funzione avverrà per istanza:

// chiamata alla funzione di disconnessione
$data->disconnetti();

Per quanto riguarda l’argomento php e connessione al databse MySQL, questi due post volevano essere solo una presentazione di base. Dubbi e perplessità, come al solito, nei commenti, grazie!

PHP – Connettersi ad un database MySQL. Prima Parte

php mysql connessione PHP   Connettersi ad un database MySQL. Prima Parte
Questo post sarà pubblicato in due parti affinchè sia più chiaro e leggibile. Iniziamo con la prima.

Un’applicazione scritta in PHP fine a se stessa ha un significato limitato se non può utilizzare informazioni contenute all’interno di un database. Ogni applicazione deve poter essere in grado di avere accesso e comunicare con l’RDBMS che gestisce la base di dati.
Tutto ciò è possibile tramite una procedurea iniziale chiamata “connessione” così da mettere in contatto lo script e il client che gestisce la base di dati. Una volta ottenuta la connessione, l’applicazione potrà lanciare i vari comandi per interagire con i dati.

Per aprire una connessione da un’applicazione in PHP al db MySQL, possiamo utilizzare la funzione nativa del linguaggio : mysql_connect()

Tale funzione restituisce un identificativo di connessione MySQL in caso di successo, altrimenti restituisce FALSE.  mysql_connect() richiede il passaggio di tre parametri come argomenti della funzione:

  1. hostname: è il nome dell’host (o macchina ospitante) relativa al db MySQL con cui ci vogliamo connettere. Identifica in modo univoco una postazione in Rete e può anche essere espresso come indirizzo IP o come stringa seguita dal numero della porta tramite cui l’RDMS attende le chiamate. Se volete connettervi ad un’installazione locale l’hostname è, in genere chimato “localhost”;
  2. username: è il nome utente abilitato alla connessione e che ha i privilegi di amministrazione del database.
  3. password: di solito, per motivi legati alla sicurezza, viene associata una password ad ogni nuovo utente MySQL. In tal caso, l’utente stesso sarà autenticato al momento della connessione con il DB.
Anche se i tre parametri da passare alla funzione devono rispettare l’ordine proposto sopra, essi possono essere anche espressi come variabili e quindi le due forme qui sotto risultano equivalenti :

// hostname
$nomehost = “localhost”;
// utente per la connessione a MySQL
$nomeuser = “username”;
// password per l’autenticazione dell’utente
$password = “password”;
// connessione tramite mysql_connect()
$connessione = mysql_connect($nomehost,$nomeuser,$password);

———————————————————————–

// connessione a MySQL tramite mysql_connect()
$connessione = mysql_connect(“localhost”,”username”,”password”);

Una buona regola per consentire ad un’applicazione PHP di connettersi a MySQL è quello di utilizzare una classe:

attiva)
{
$connessione = mysql_connect($this->nomehost,$this->nomeuser,$this->password);
}else{
return true;
}
}
}
?>



Vediamo in dettaglio il codice della classe :

  • i parametri per la connessione sono stati associati al modificatore “private” che li renderà, pertanto, disponibili solo all’interno della classe cui appartengono in base alle regole di visibilità del paradigma OOP nelle ultime versioni di PHP;
  • viene effettuato un controllo sull’eventuale esistenza di connessioni attive;
  • viene definita una funzione personalizzata (chiamata connect() ) che potrà essere sembre sfruttata e richiamata qualora si voglia stabilire una connessione a MySQL; il modificatore public associato alla funzione siginifica che sia gli attributi che i metodi di cui sono dotati gli oggetti ad essa relativi sono accessibili anche dall’esterno;
  • solo nel caso non fosse attiva alcuna connessione, i parametri che occorrono saranno passati alla funzione mysql_connect() che cercherà di connettersi, altrimenti la richiesta al DB non verrà inviata.

Affinchè la classe appena implementata risulti utile ogni qual volta ci si voglia connettere al db in un’applicazione php, occorre salvarla in un file chiamato ad esempio funzioni_mysql.php cosicchè possa essere richiamata in qualsiasi momento tramite semplice inclusione. Inoltre, affinchè la classe possa essere utilizzata dovrà essere istanziata in modo tale che sarà possibile utilizzare la funzione per la connessione a MySQL tramite una semplice chiamata:

// inclusione del file contenente la classe
include “funzioni_mysql.php”
// istanza della classe
$data = new MysqlClass();
// chiamata alla funzione di connessione
$data->connetti();


Vi aspetto lunedì prossimo per la seconda parte che riguarda, come avrete immaginato, la corretta chiusura della connessione

Come creare un database MySql con cPanel

Come lo definisce Wikipedia : ‘cPanel (control Panel, cioè Pannello di Controllo) è un pannello di controllo web grafico per la gestione e l’amministrazione di siti internet. Il software è distribuito da cPanel Inc. ed è con licenza proprietaria. È progettato per servizi di hosting commerciale e richiede una tassa mensile per la licenza. cPanel è [...]

SQL Executionner : plugin wordpress per eseguire velocemente query sql.

Wordpress è una piattaforma, come ben sapete, che lavora a braccetto con un database MySQL. Per ogni webmaster è importante saper conoscere e gestire il db con cui interagisce anche se in molti ne ingorano perfino la struttura di base. Un aiuto, in tal caso, ci può venire da questo plugin per WP che ingloba [...]

La tecnica SQL Injection può davvero compromettere la sicurezza del vostro blog #1

Il PHP è il linguaggio di scripting attualmente più utilizzato nel web anche e soprattutto per la sua facilità di uso. Anche utenti poco esperti possono avvicinarsi a questo linguaggio e realizzare applicazioni funzionanti nel giro di poco tempo. Ma come in tutte le cose che, in apparenza sembra no facili, occorre porre molta attenzione [...]