Question

Je suis en train d'écrire quelques DB routines et je suis en utilisant des requêtes préparées.Mon environnement est PDO avec PHP5.

Je comprends préparées principalement de fournir un avantage de performance, ainsi que de certains auxiliaires des bonus tels que ne pas avoir à manuellement SQL-échapper à la saisie de données.

Ma question est au sujet de la performance de la partie.

J'ai deux implémentations d'un getPrice fonction ci-dessous qui prend l'id d'un produit et retourne son prix.

getPrice_A réutilise le même objet PDOStatement à travers les appels ultérieurs à l'intérieur même de l'exécution de script.Est-ce nécessaire ou recommandé?Si oui, est-il un moyen d'éviter de dupliquer ce code supplémentaire dans chaque get*() dans chaque modèle unique?

getPrice_B crée un nouvel objet PDOStatement à chaque appel.Sera le SGBD reconnaître cette déclaration a déjà été préparé et être encore capable de sauter certains travaux?En d'autres termes, est-ce à la mise en œuvre correctement profiter des avantages de performances des requêtes préparées?

Après avoir écrit tout cela et de le lire, j'imagine getPrice_B est fine et getPrice_A est de fournir un un avantage négligeable sur le dessus de ce qui peut ou peut ne pas être en vaut la complication supplémentaire.

Je voudrais encore entendre à coup sûr de quelqu'un de plus informé que.

Supposons que $pdo est valide, connecté objet PDO dans les exemples ci-dessous.

<?php
class Product {
    static function &getPrice_A($id) {
        static $stmt;
        if (!$stmt) {
            $stmt = $pdo->prepare('SELECT price FROM products WHERE id = ?');
        }
        $stmt->execute(array($id));
        return $stmt->fetchColumn(0);
    }

    static function &getPrice_B($id) {
        $stmt = $pdo->prepare('SELECT price FROM products WHERE id = ?');
        $stmt->execute(array($id));
        return $stmt->fetchColumn(0);
    }
}

// example usage:
$price = Product::getPrice(4982);
echo "Product 4982 costs $price\n";
Était-ce utile?

La solution

Ce que je comprends, préparées vont réutiliser le code SQL généré plan si c'est la même déclaration, de sorte que la base de données permettra de voir la même déclaration préparée à l'avance et ne pas avoir à faire le travail pour comprendre comment interroger la base de données.Je dirais que le travail supplémentaire d'enregistrement de la déclaration en Product::getPrice_A n'est généralement pas très utile, de plus en plus, car il peut masquer le code plutôt que d'un problème de performance.Lorsque vous traitez avec les performances, je pense qu'il est toujours préférable de se concentrer sur le code de la clarté et de performances lorsque vous avez de réelles statistiques qui indiquent un problème.

Je dirais "oui, le travail supplémentaire est inutile" (peu importe si c'est vraiment améliore les performances).Aussi, je ne suis pas un très grand DB expert, mais le gain de performance des déclarations préparées à l'avance est quelque chose que j'ai entendu d'autres, et c'est au niveau de base de données, pas du niveau du code (donc si le code est en fait l'invocation d'une instruction paramétrée sur la DB, puis la DB pouvez faire ces plan d'exécution de la mise en cache...bien que selon la base de données, vous pouvez obtenir le bénéfice, même sans l'instruction paramétrée).

De toute façon, si vous êtes vraiment inquiet au sujet (et de voir) de la base de données des problèmes de performances, vous devriez regarder dans une solution de mise en cache...de qui je le recommande fortement memcached.Avec une telle solution, vous pouvez mettre en cache les résultats de votre requête et même pas touché à la base de données pour des choses que vous accédez fréquemment.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top