¿Es get_option () más rápido que acceder a get_transient ()?

8

Hoy ejecuté una prueba sobre mi base de datos para explorar la diferencia de velocidad entre acceder a una clave desde opciones, tabla personalizada y transitorios. Ejecuté la prueba 1000 veces y el siguiente es el tiempo necesario para ejecutar 1000 operaciones de obtención:

  1. get_transient() 0.0245 segundos
  2. get_option() 0.0068 segundos
  3. operación de selección simple de la tabla personalizada 0.65 segundos

También verifiqué que el transitorio no expiró durante esta prueba. Entonces, la pregunta es, ¿es get_option()más rápido get_transient()o estropeé algo en mi prueba? ¿Es el retraso de la tabla personalizada debido a que WordPress almacena en caché las opciones predeterminadas? Además, ¿las opciones también se almacenan en caché por diferentes complementos de almacenamiento en caché como los transitorios?

aprendizaje_13
fuente
La respuesta a esto es variable, teniendo en cuenta que con un caché de objetos, los transitorios no utilizarán opciones en absoluto. De todos modos, es una microoptimización y una pérdida de tiempo. La carga automática como una opción simplemente cambia el costo a otra parte
Tom J Nowell

Respuestas:

15

Hoy ejecuté una prueba sobre mi base de datos para explorar la diferencia de velocidad entre acceder a una clave desde opciones, tabla personalizada y transitorios. Ejecuté la prueba 1000 veces y el siguiente es el tiempo necesario para ejecutar 1000 operaciones de obtención:

Tenga en cuenta que la tabla de opciones se usa tanto para las opciones como para los transitorios en la mayoría de los sistemas, y esa tabla se ha optimizado, con índices agregados. Entonces no es una comparación justa

get_transient () 0.0245 segundos get_option () 0.0068 segundos operación de selección simple de la Tabla personalizada 0.65 segundos

Esta también es una comparación injusta, las opciones con el autoloadconjunto de opciones se cargarán de forma avanzada en una sola consulta desde el principio. Así que get_optionestá tirando de WP_Cache, la opción ya se ha recuperado.

TLDR: en realidad no está recuperando la opción, ya fue recuperada, solo la extrae de la memoria debido a la autoloadopción

También verifiqué que el transitorio no expiró durante esta prueba.

Esto no debería tener un impacto en un sistema normal en la recuperación transitoria, después de todo, no sabe si ha expirado hasta que se haya recuperado.

Entonces, la pregunta es: ¿get_option () es más rápido que get_transient () o he estropeado algo en mi prueba?

Depende:

  • En la mayoría de los sistemas, los transitorios se almacenan usando opciones, ambos implican una get_optionllamada
  • Las opciones con autoloadset to true se cargan en una sola llamada al inicio, por lo que se mantienen en la memoria, no se realizan consultas después de esto
  • El almacenamiento en caché de objetos almacena en caché las opciones cargadas automáticamente y los transitorios

¿Es el retraso de la tabla personalizada debido a que WordPress almacena en caché las opciones predeterminadas?

Muy posible, pero la rapidez con la que toma esa selección depende mucho de la consulta y el diseño de la tabla.

Además, ¿las opciones también se almacenan en caché por diferentes complementos de almacenamiento en caché como los transitorios?

Sí, WP_Cachese utiliza, lo que lo almacenará en la memoria para el resto de la solicitud. Los complementos de almacenamiento en caché pueden persistir estos valores por razones de rendimiento.

Repetibilidad

Todos estos se almacenan en caché, por WP_Cachelo que la segunda vez que lo solicite, no estará involucrado ningún DB.

La variabilidad y depende

Todo esto supone una base común, pero ¿qué pasa con los cachés de objetos?

Vamos a introducir una instancia de MemcacheD o una instancia de Redis (Recomiendo encarecidamente que lo haga si tiene la opción, ENORMES beneficios de rendimiento para sitios bien construidos, especialmente si los usa para el almacenamiento en caché de páginas, a menos que tenga algo como la configuración de Varnish)

Ahora tenemos una nueva situación:

  • Ahora los datos se almacenan en la RAM, y una vez que se obtienen de la base de datos, se ceban y los tiempos de acceso se reducen drásticamente. Todavía más lento que una variable, pero significativamente más rápido que una consulta de base de datos
  • Se almacenan muchos datos nuevos WP_Cacheque normalmente no lo están. Por ejemplo WP_Post, objetos, post meta, etc.
  • WP_Cache ahora persiste en todas las solicitudes
  • MemcacheD, etc. puede eliminar los transitorios caducados, etc.

Entonces, los transitorios y las opciones tienen el mismo costo de acceso. Ya estaban cerca, pero ahora son insignificantes y tienen más que ver con la carga de la CPU en el momento en que se realizó la solicitud.

Entonces, para el rendimiento, ¿debo usar transitorios u opciones?

Si bien es una pregunta digna de preguntarse, la respuesta es que la diferencia es insignificante y está dentro de los márgenes de error.

No es tan simple

Por lo tanto, detenga la micro-optimización, son el mismo medio de almacenamiento, y esto no es digno de su tiempo.

  • Use las opciones si necesita almacenar algo para todo el sitio
  • Use transitorios para almacenar temporalmente cosas que son caras de calcular para que no tenga que hacerlo la próxima vez

No vale la pena elegir uno sobre el otro en función del rendimiento, no hay una diferencia significativa.

Hay cosas mucho mejores que hacer para optimizar que brindan ahorros significativamente mayores, por ejemplo, usar taxonomías en lugar de meta en consultas de publicaciones, no usar __notparámetros de estilo, hacer menos cosas en la página, instalar un caché de objetos, publicaciones más bajas por página, evitar solicitudes remotas etc.

¿Qué pasa con una tabla personalizada que ...

No, la tabla de opciones ya está bien optimizada, el uso de una tabla personalizada simplemente moverá las operaciones fuera del sistema de almacenamiento en caché de WP, lo que le obligará a escribir su propio

Tom J Nowell
fuente
En cuanto a la opción, se carga automáticamente en mi caso. La tabla personalizada contiene solo dos filas y una consulta de selección para obtener datos.
learning_13
Estoy haciendo esto para mi complemento y tengo que elegir entre cualquiera de ellos. La tabla personalizada fue más fácil de implementar según mi diseño, pero el costo de recuperación es lo suficientemente grande como para retrasar la carga de la página.
learning_13
2
@ learning_13, estaba haciendo la pregunta equivocada, y tal vez tanto Tom como yo no pudimos transmitir el mensaje en nuestras respuestas: el almacenamiento en caché adecuado hará que lo que decida usar sea lo suficientemente eficaz para los sitios que se preocupan por el rendimiento. La decisión sobre cómo almacenar los datos debe hacerse en función de la estructura de su complemento y su funcionalidad, el rendimiento debe ser lo último en lo que debe pensar.
Mark Kaplun
2
@ aim100k, no involucre a los "padres" en las respuestas aquí. Lo que la gente hace para ganarse la vida no debe mencionarse a menos que sea relevante para la respuesta o pregunta. Si no le gusta una respuesta, denle un voto negativo. Si cree que la respuesta podría ser técnicamente correcta pero ofensiva, puede intentar editarla, marcarla o debatirla en el meta sitio.
Mark Kaplun
@ mark-kaplun, digamos que almaceno datos en la tabla personalizada y obtengo datos de esta para cada publicación que representa mi plugin para mostrar algunos datos. Entonces, ¿los complementos de almacenamiento en caché o la optimización de almacenamiento en caché del usuario se encargarán de almacenar en caché esa tabla? ¿Y los esfuerzos adicionales en la implementación y el diseño cambiarán solo para usar transitorios / opciones en lugar de usar una tabla personalizada que se ajuste más a mi diseño, una micro optimización (prematura) sobre la velocidad de carga de la página?
learning_13
4

Si no se encuentra el almacenamiento en caché de objetos, get_transientllama get_optiondos veces, una o el intervalo de vencimiento y uno para el valor, por lo tanto, no será más rápido.

get_optionel rendimiento por sí solo se verá afectado por si la opción está "cargada automáticamente" (predeterminada) o no. Todas las opciones cargadas automáticamente se recuperan en una solicitud para la base de datos y se almacenan en la memoria caché, y por lo tanto, debería haber muy poco impacto en cuántas veces se llama, get_optionincluso si se trata de diferentes opciones.

Cuando accede a la base de datos directamente, omite todas las mejoras de rendimiento de almacenamiento en caché y otras, y se espera que sea más lento a menos que implemente alguna lógica inteligente usted mismo.

Dicho todo esto, no estoy seguro de que su prueba haya sido buena, pero de todos modos, toda la discusión no tiene sentido, ya que si realmente le importa el rendimiento, usará el sistema de caché de objetos (y el complemento correspondiente) que acercará mucho más el tiempo de acceso a los datos a cero ... y, por supuesto, si decide usar sus propias tablas de base de datos, debe integrar sus API de acceso con el mecanismo de almacenamiento en caché de objetos.

Mark Kaplun
fuente