2010-03-12 10 views
5

Récemment, je parcourais un blog et j'ai remarqué quelques points sur l'utilisation de PDO dans mysql et cela a changé mon point de vue sur le PDO. Les points sont les suivants:PDO dans la performance mysql

  1. déclarations préparées autochtones ne peuvent pas tirer profit de la cache de requêtes, ce qui entraîne des performances moindres.

  2. déclarations préparées autochtones ne peuvent pas exécuter CERTAINS types de requêtes, comme « SHOW TABLES »

  3. déclarations natives préparées ne communiquent pas correctement la longueur de colonne pour certaines autres requêtes « SHOW », ce qui entraîne des résultats tronqués.

  4. L'appel de procédures stockées plusieurs fois à l'aide d'instructions préparées natives provoque la chute de la connexion.

Quelqu'un peut-il commenter s'il vous plaît?

Je voulais un cache de requête dans mon application Web. Je me prépare à déplacer mon application Web pour utiliser le PDO après avoir pris en compte les problèmes de performances sur mon site Web. Quelqu'un peut-il me suggérer s'il vous plaît?

Merci d'avance.

+1

Vous devriez avoir ajouté le lien vers ce blog que je crois être [this] (http://wezfurlong.org/blog/2006/apr/using-pdo-mysql/). L'auteur a précisé que "Quand j'ai écrit cela en 2006, oui, c'était vrai" et "Je n'ai aucune idée si cela a été résolu par la suite ou non - je l'espère après plusieurs années." quand quelqu'un a souligné que le premier point est faux. Donc, la réponse acceptée ci-dessous peut ne plus être applicable maintenant. –

Répondre

5

bien

  • vous avez raison pour le premier point
  • Les SHOW TABLES et SHOW sont des commandes couramment utilisés dans la plupart des cas d'utilisation
  • Iam utilisant statemends préparés en combinaison avec des procédures stockées et pas pourtant connu de tels problèmes.

Vous pouvez utiliser la commande suivante pour activer la mise en cache de requête:

$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); 

Cette commande est disponible à partir de PHP 5.1.3 uniquement.

2

Les instructions préparées ne pas utiliser le cache de requêtes, mais il a des conditions:

Du 5.1 Doc:

Befor MySQL 5.1.17, les instructions préparées n'utilisent pas le cache de requête. À partir de 5.1.17, les instructions préparées utilisent le cache de requêtes sous certaines conditions, qui diffèrent selon la méthode de préparation:

  • déclarations qui sont émises en utilisant le protocole binaire en utilisant mysql_prepare() et mysql_stmt_execute().
  • Instructions émises à l'aide du protocole de texte (non-binaire) à l'aide de PREPARE et EXECUTE. See Section 12.6, «Syntaxe SQL pour les instructions préparées».

qui le 5.5 Doc reformule comme:

déclarations préparées qui sont émises en utilisant le protocole binaire en utilisant mysql_prepare() et mysql_stmt_execute(), sont soumis à des restrictions sur la mise en cache. La comparaison avec les instructions dans le cache de requête est basée sur le texte de l'instruction après l'expansion de? marqueurs de paramètres. L'instruction est comparée uniquement avec les autres instructions en mémoire cache qui ont été exécutées à l'aide du protocole binaire. C'est-à-dire que, pour des besoins de cache de requête, les instructions préparées émises en utilisant le protocole binaire sont distinctes des instructions préparées émises en utilisant le protocole de texte.

+0

"Avant MySQL 5.1.17, les instructions préparées n'utilisaient pas le cache de requête A partir du 5.1.17, les instructions préparées utilisent le cache de requête dans certaines conditions, qui diffèrent selon la méthode de préparation: ... Les instructions qui sont émises en utilisant protocole binaire utilisant mysql_stmt_prepare() et mysql_stmt_execute() " – thomasrutter

+0

@thomasrutter - Bonne idée de citer le document plutôt que de le lier. J'ai ajouté la documentation pour être plus utile. – SeanDowney

+0

Il y a aussi quelques qualifications au-dessous de ce texte - par exemple, la mise en cache est faite après l'expansion de "?" paramètres, et il y a quelques choses à noter selon que vous utilisez PREPARE et EXECUTE ou que vous utilisiez les fonctions API prepare() etc. – thomasrutter