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

PHP PDO:in che modo la ri-preparazione di un'istruzione influisce sulle prestazioni

MySQL (come la maggior parte dei DBMS) memorizzerà nella cache i piani di esecuzione per le istruzioni preparate, quindi se l'utente A crea un piano per:

SELECT * FROM some_table WHERE a_col=:v1 AND b_col=:v2

(dove v1 e v2 sono bind vars) quindi invia i valori che devono essere interpolati dal DBMS, quindi l'utente B invia la stessa query (ma con valori diversi per l'interpolazione) il DBMS non deve rigenerare il piano. cioè è il DBMS che trova il piano corrispondente, non il PDO.

Tuttavia questo significa che ogni operazione sul database richiede almeno 2 round trip (il primo per presentare la query, il secondo per presentare i bind vars) invece di un singolo round trip per una query con valori letterali, quindi questo introduce costi di rete aggiuntivi . C'è anche un piccolo costo per dereferenziare (e mantenere) la cache di query/piani.

La domanda chiave è se questo costo sia maggiore del costo di generazione del piano in primo luogo.

Sebbene (nella mia esperienza) sembri sicuramente esserci un vantaggio in termini di prestazioni utilizzando le istruzioni preparate con Oracle, non sono convinto che lo stesso sia vero per MySQL, tuttavia, molto dipenderà dalla struttura del database e dalla complessità del query (o più specificamente, quante diverse opzioni può trovare l'ottimizzatore per risolvere la query).

Prova a misurarlo tu stesso (suggerimento:potresti voler impostare la soglia della query lenta su 0 e scrivere del codice per riconvertire i valori letterali in rappresentazioni anonime per le query scritte nei log).