Get_option () est-il plus rapide que d'accéder à get_transient ()?


8

Aujourd'hui, je lance un test sur ma base de données pour explorer la différence de vitesse entre l'accès à une clé à partir d'options, d'une table personnalisée et de transitoires. J'ai exécuté le test 1000 fois et voici le temps nécessaire pour exécuter 1000 opérations get:

  1. get_transient() 0,0245 secondes
  2. get_option() 0,0068 secondes
  3. opération de sélection simple à partir du tableau personnalisé 0,65 seconde

J'ai également vérifié que le transitoire n'était pas expiré pendant ce test. La question est donc: est-ce get_option()plus rapide get_transient()ou ai-je gâché quelque chose dans mon test? Le délai de table personnalisé est-il dû aux options mises en cache par défaut par WordPress? De plus, les options sont-elles également mises en cache par différents plugins de mise en cache comme les transitoires?


La réponse à cette question est variable, en gardant à l'esprit qu'avec un cache d'objets, les transitoires n'utiliseront pas d'options du tout. De toute façon, c'est une micro-optimisation et une perte de temps. Le chargement automatique en option déplace simplement le coût ailleurs
Tom J Nowell

Réponses:


15

Aujourd'hui, je lance un test sur ma base de données pour explorer la différence de vitesse entre l'accès à une clé à partir d'options, d'une table personnalisée et de transitoires. J'ai exécuté le test 1000 fois et voici le temps nécessaire pour exécuter 1000 opérations get:

Gardez à l'esprit que la table d'options est utilisée à la fois pour les options et les transitoires sur la plupart des systèmes, et cette table a été optimisée, avec des index ajoutés. Ce n'est donc pas une comparaison juste

get_transient () 0,0245 secondes get_option () 0,0068 secondes opération de sélection simple à partir du tableau personnalisé 0,65 secondes

C'est également une comparaison injuste, les options avec le autoloadjeu d'options seront chargées en avance dans une seule requête dès le début. Il en get_optionva de même pour WP_Cachel'option, l'option a déjà été récupérée.

TLDR: Il ne récupère pas réellement l'option, il a déjà été récupéré, il est juste en train de le retirer de la mémoire en raison de l' autoloadoption

J'ai également vérifié que le transitoire n'était pas expiré pendant ce test.

Cela ne devrait pas avoir d'impact sur un système normal sur la récupération transitoire, après tout, il ne sait pas s'il a expiré jusqu'à ce qu'il soit récupéré.

La question est donc de savoir si get_option () est plus rapide que get_transient () ou ai-je gâché quelque chose dans mon test?

Ça dépend:

  • Sur la plupart des systèmes, les transitoires sont stockés à l'aide d'options, les deux impliquent un get_optionappel
  • Les options dont la valeur est autoloaddéfinie sur true sont toutes chargées en un seul appel au début, elles sont donc conservées en mémoire, aucune requête ne se produit après cela.
  • La mise en cache d'objets met en cache à la fois les options chargées automatiquement et les transitoires

Le délai de table personnalisé est-il dû aux options mises en cache par défaut par WordPress?

Très possible, mais la rapidité de cette sélection dépend beaucoup de la conception de la requête et de la table

De plus, les options sont-elles également mises en cache par différents plugins de mise en cache comme les transitoires?

Oui, WP_Cacheest utilisé, qui le stockera en mémoire pour le reste de la demande. La mise en cache des plugins peut conserver ces valeurs pour des raisons de performances.

Répétabilité

Ceux-ci sont tous mis en cache via WP_Cachedonc la deuxième fois que vous le demandez, aucune base de données n'est impliquée.

Variabilité et cela dépend

Tout cela suppose une base commune, mais qu'en est-il des caches d'objets?

Permet d'introduire une instance MemcacheD ou une instance Redis (je vous recommande fortement de le faire si vous avez l'option, d'énormes avantages en termes de performances pour les sites bien construits, surtout si vous les utilisez pour la mise en cache des pages, sauf si vous avez quelque chose comme la configuration de Varnish)

Maintenant, nous avons une nouvelle situation:

  • Les données sont désormais stockées dans la RAM et une fois extraites de la base de données, elles sont amorcées et les temps d'accès sont considérablement réduits. Toujours plus lent qu'une variable, mais beaucoup plus rapide qu'une requête de base de données
  • Beaucoup de nouvelles données sont stockées dans WP_Cachece qui n'est normalement pas le cas. Par exemple, WP_Postobjets, post méta, etc.
  • WP_Cache persiste désormais à travers les demandes
  • MemcacheD, etc. peut éliminer les transitoires expirés, etc.

Alors maintenant, les transitoires et les options ont le même coût d'accès. Ils étaient déjà proches, mais ils sont désormais négligeables et ont davantage à voir avec la charge du processeur au moment de la demande.

Donc, pour des performances dois-je utiliser des transitoires ou des options?

Bien qu'il soit utile de se poser la question, la réponse est que la différence est négligeable et dans les marges d'erreur

ce n'est pas aussi simple

Alors arrêtez la micro-optimisation, c'est le même support de stockage, et ce n'est pas digne de votre temps

  • Utilisez des options si vous avez besoin de stocker quelque chose à l'échelle du site
  • Utilisez des transitoires pour stocker temporairement des éléments coûteux à calculer afin de ne pas avoir à la prochaine fois

Cela ne vaut pas la peine de choisir l'un plutôt que l'autre en fonction des performances, il n'y a pas de différence significative.

Il y a de bien meilleures choses à faire pour optimiser ce qui permet de réaliser des économies significativement plus importantes, par exemple en utilisant des taxonomies au lieu de méta dans les requêtes de publication, en n'utilisant pas les __notparamètres de style, en faisant moins de choses sur la page, en installant un cache d'objets, en réduisant les publications par page, en évitant les requêtes distantes etc

Qu'en est-il d'une table personnalisée qui ...

Non, le tableau d'options est déjà bien optimisé, l'utilisation d'un tableau personnalisé déplacera simplement les opérations en dehors du système WP Caching, vous forçant à écrire le vôtre


En ce qui concerne l'option, il est automatiquement chargé dans mon cas. Le tableau personnalisé ne contient que deux lignes et une requête de sélection pour extraire des données.
learning_13

Je fais cela pour mon plugin et je dois choisir entre l'un d'eux. La table personnalisée était plus facile à implémenter selon ma conception, mais le coût de récupération est suffisamment important pour retarder le chargement de la page.
learning_13

2
@ learning_13, vous posiez la mauvaise question, et peut-être que tom et moi n'avons pas réussi à transmettre le message dans nos réponses - une mise en cache appropriée rendra tout ce que vous déciderez d'utiliser suffisamment performant pour les sites soucieux de performances. La décision sur la façon de stocker les données doit être prise en fonction de la structure de votre plugin et de ses fonctionnalités, les performances doivent être la dernière chose à laquelle vous devez penser.
Mark Kaplun

2
@ aim100k, veuillez ne pas impliquer les "parents" dans les réponses ici. Ce que les gens font pour leur vie ne doit pas être évoqué, sauf s'il est pertinent pour la réponse ou la question. Si vous n'aimez pas une réponse, votez contre. Si vous pensez que la réponse peut être techniquement correcte mais offensante, vous pouvez soit essayer de la modifier, la signaler ou en discuter sur le méta-site.
Mark Kaplun

@ mark-kaplun, disons que je stocke des données dans la table personnalisée et que j'en récupère les données pour chaque rendu de post où mon plugin est impliqué pour afficher certaines données. Alors, les plugins de mise en cache ou l'optimisation de la mise en cache de l'utilisateur se chargeront-ils de la mise en cache de cette table? Et les efforts supplémentaires dans la mise en œuvre et la conception changeront-ils uniquement pour utiliser les transitoires / options au lieu d'utiliser une table personnalisée qui s'intègre davantage dans ma conception, une optimisation micro (prématurée) par rapport à la vitesse de chargement des pages?
learning_13

4

Si aucun cache d'objet n'est trouvé, get_transientappelle get_optiondeux fois, une fois ou l'intervalle d'expiration et un pour la valeur, cela ne va pas être plus rapide.

get_optionles performances en elles-mêmes seront affectées selon que l'option est "chargée automatiquement" (par défaut) ou non. Toutes les options chargées automatiquement sont récupérées dans une seule demande pour la base de données et stockées dans le cache mémoire, et à cet effet, il devrait y avoir très peu d'impact sur le nombre de fois que vous appelez, get_optionmême s'il s'agit de différentes options.

Lorsque vous accédez directement à la base de données, vous contournez toutes les améliorations de mise en cache et de performances, et cela devrait être plus lent, sauf si vous implémentez vous-même une logique intelligente.

Cela dit, je ne suis pas sûr que votre test ait été bon, mais malgré tout, toute la discussion est inutile, comme si vous vous souciez vraiment des performances, vous utiliserez le système de cache d'objets (et le plugin correspondant), ce qui rapprochera le temps d'accès aux données. à zéro .... et bien sûr, si vous décidez d'utiliser vos propres tables de base de données, vous devez intégrer vos API d'accès au mécanisme de mise en cache des objets.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.