Usted sabe que un sitio rápido == usuarios más felices, una clasificación mejorada de Google y un aumento en las conversiones. Tal vez realmente piense que su sitio de WordPress es lo más rápido posible: observa el rendimiento del sitio, desde las mejores prácticas para configurar un servidor, hasta el código lento y descargar las imágenes en un CDN, pero ¿es todo? Con sitios web dinámicos basados en bases de datos, como WordPress, puede tener un problema: las consultas de la base de datos ralentizan su sitio. En esta publicación, explicaré cómo identificar los interrogatorios que causan bloqueos, cómo comprender los problemas con ellos, junto con remedios rápidos y otros enfoques para acelerar el tiempo de ejecución de la consulta SQL. Usaré una consulta real que he abordado recientemente, lo que ralentiza las cosas en el portal para deliciosos clientes.com.
Identificar el primer paso de consulta SQL lenta para arreglar la consulta SQL Shle es encontrarlas. Ashley también cantó las alabanzas del complemento para el complemento de la función de consulta del blog, y la característica de consultar las bases de datos del complemento realmente hace una herramienta invaluable para identificar SQL SQL y mejorar el rendimiento de la base de datos. El complemento informa todas las interrogatorias de la base de datos ejecutadas durante la solicitud de página. Le permite filtrarlos por código o componente (el tema, el tema o el núcleo de WordPress) apelando y destacando las consultas duplicadas y lentas:
Si no desea instalar un enchufe de solución de problemas en un sitio de producción (puede preocuparse por agregar una sobrecarga de rendimiento), puede optar por activar el MySQL Slow Query Journal, que registra toda la consulta que dura un cierto período de tiempo.llevar a cabo.Esto es relativamente simple de configurar y configurar dónde registrar los interrogations.Debido a que este es un cambio de servidor, el rendimiento será más bajo que un complemento de solución de problemas en el sitio, pero debe deshabilitarse cuando no lo use.Comprender los interrogatorios SQL lentos Una vez que haya encontrado una consulta costosa que desea mejorar, el siguiente paso es tratar de comprender qué hace que la consulta se ralentice.Recientemente, durante el desarrollo de nuestro sitio, encontramos una consulta que duró unos 8 segundos para ejecutarse.
Seleccione L.Key_id, L.order_id, L.activation_email, L. L.celice_ky, L.Software_Product_id, L.Software_Version, L.Activations .Status, PM2.Post_ID como ‘Product_id’, PM.Meta_Value como ‘use_id’ de oiz6q8a_woocommerce_software oiz6q8a_wooCommerce_software_subscriptations s en s.key_id = l.key_id interior interior _dder. pm.post_id = p.id y pm.meta_key = ‘_customer_user’ Inner se une oiz6q8a_postmeta en pm2.meta_key = ‘_software_productura p.post_type = ‘shop_order y pm. 279 por s.next_payment_date Usamos WooCommerce y una versión personalizada de las suscripciones de software de WooCommerce para ejecutar nuestra tienda de arados. El propósito de esta consulta es obtener todas las suscripciones para un cliente a quien conocemos el número de cliente. WooCommerce tiene un modelo de datos algo complejo, en el sentido de que, aunque un pedido se almacena como una publicación personalizada, la identificación del cliente (para las tiendas donde cada cliente recibe un usuario de WordPress creado para él) no se almacena como post_author, sino como como Una publicación de metadatos.
También hay algunas conexiones interiores a tablas personalizadas creadas por el complemento de suscripción de software, que hacen que esta declaración SQL sea más compleja y difícil de entender. Profundamos para comprender mejor la consulta. MySQL es su amigo para optimizar la consulta SQL MySQL tiene una instrucción útil descrita útil para eliminar la información sobre la estructura de una tabla, como columnas, tipos de datos, valores predeterminados. Entonces, si ejecuta describe wp_postmeta; Verá los siguientes resultados:
Tipo de tecla CAMP implícitamente de forma adicional/td>
pri
nul
incremento de automóvil
post_id
bigint (20) unsigned
no
mul
0
meta_key
varchar (255)
da
mul
nul
meta_valoare
text largo
da
nul
Es genial, pero es posible que ya lo sepas. Pero, ¿sabía que el prefijo de la instrucción descrita se puede usar en selección, insertar, actualizar, reemplazar y eliminar? Esto se conoce con más frecuencia por su sinónimo Explication y nos proporcionará información detallada sobre cómo se ejecutará la instrucción.
Estos son los resultados de nuestra consulta lenta: ID SELECT_TYPE Tipo posible_keys Key_len Rows Rows
1
simple
pm2
ref
meta_key
meta_key
576
const
28
usando dónde; Uso temporal; Usando la clasificación de archivos
1
simple
p.m
ref
post_id, meta_key
meta_key
576
const
37456
usando dónde
<
1
simple
p
eq_ref
primario, type_status_date
<td
primario
8
deliciososbrainsdev.pm.post_id
1
usando donde
1
simple
l
ref
primario, orden_id
ID de orden
8
DeliciousBrainsdev.pm.post_id
1
usando la condición de índice; Usando donde
1
simple
s
eq_ref
primario
primario
8
deliciososbrainsdev.l.key_id
1
nul
A primera vista, esto no es muy fácil de interpretar. Afortunadamente, el punto de sitio creó una guía integral para comprender la declaración.
La columna más importante es el tipo, que describe cómo se combinan las tablas. Si ve todo, significa que MySQL lee la tabla completa en el disco, aumenta las tasas de E/S y carga el procesador. Esto se conoce como “escaneo completo de la tabla”, más sobre esto más adelante. La columna de las filas también es una buena indicación de lo que MySQL tiene que hacer, ya que muestra cuántas líneas ha buscado encontrar un resultado. Explicar también nos brinda más información que podemos usar para optimizar. Por ejemplo, la tabla PM2 (wp_postmeta) nos dice que usar filesort, porque solicitamos los resultados utilizando una cláusula de orden por orden en la instrucción. Si tengo un grupo y una consulta, agregaría una sobrecarga a la ejecución. La investigación visual con un plan de ejecución de Workbench MySQL es otra herramienta útil para este tipo de investigación. Para las bases de datos que se ejecutan en MySQL 5.6 y superior, los resultados de explicación se pueden mostrar como JSON, y MySQL Workbench convierte ese JSON en un plano visual de ejecución de la instrucción:
Atraiga automáticamente su atención a los problemas, coloreando partes de la consulta dependiendo del costo. Podemos ver de inmediato que la unión en WP_WOOCOMMERCE_SOFTWARE_LICES (alias L) tiene un problema grave. ¡Hagamos algunos ajustes de consulta! Resolver los interrogatorios SQL lentos con la optimización de consultas que parte de la consulta realiza un escaneo completo de la tabla, que debe intentar evitar, ya que utiliza una columna ORDER_ID sin unidades entre la tabla WP_WOOCOMMERCE_SOFTWARES_LICENCIS y la tabla WP_POSTS. Este es un problema común para los interrogatorios lentos y uno que se puede resolver fácilmente para mejorar el rendimiento de la consulta. Order_id Indici es una identificación de datos bastante importante en la tabla y, si interrogamos, debemos tener un índice en la columna ., De lo contrario, MySQL escaneará literalmente cada fila de la tabla hasta que se encuentren las líneas necesarias. Agreguemos un índice y veamos lo que esto hace: crear índice orden_id en wp_wooCommerce_software_liceces (orden_id)
UAU, logramos reducir la consulta durante 5 segundos agregando ese índice, ¡buen trabajo! Pero por qué detenerse aquí, hay algunas técnicas de optimización adicionales que podemos usar para reducir el tiempo de ejecución y reducir los bloqueos del servidor de la base de datos.
Conozca su consulta Examine la consulta: unirse a unión, subterroging.¿Las cosas que no necesita?¿Se puede hacer la optimización?En este caso, nos unimos a la tabla de licencias en la tabla de publicaciones usando Order_id todo el tiempo restringiendo la declaración a los tipos de Post Shop_order.Esto es para imponer la integridad de los datos para garantizar que solo usemos los registros correctos del pedido, sin embargo, en realidad es una parte redundante de la consulta.Sabemos que es cierto que una licencia de software en la tabla tiene un orden_id con respecto al comando wooCommerce en la tabla de publicación, ya que esto se impone en el código de complemento PHP.Eliminemos el sindicato y veamos si eso mejora las cosas:
Esta no es una gran economía, pero la consulta ahora tiene menos de 3 segundos. ¡Memor en caché todas las cosas! Si su servidor no tiene los interrogatorios MySQL en el caché en el caché, entonces vale la pena producirlo. Esto significa que MySQL mantendrá un registro de todas las instrucciones ejecutadas junto con el resultado, y si se ejecuta una instrucción idéntica más tarde, se devuelven los resultados almacenados en caché. El caché no queda desactualizado porque MySQL limpia el caché cuando se cambian las tablas. Consulta Monitor descubrió que nuestra consulta se ejecuta 4 veces en una sola página de carga y, aunque es bueno activar la memoria de consulta MySQL, se debe evitar la lectura de la base de datos en una sola solicitud. La memoria en caché estático en su código PHP es una forma simple y muy efectiva de resolver este problema. Básicamente, asume los resultados de un interrogatorio de la base de datos por primera vez cuando se solicite y guárdelos en la propiedad estática de una clase, y luego las llamadas posteriores devolverán los resultados de la propiedad estática: clase wc_software_subscription {protegido estático estático protegido $ suscripción = array (); Función estática pública get_user_subscriptions ($ user_id) {if (isset (static: $ suscripción [$ user_id])) {retorno estático: $ suscripciones [$ user_id]; } Global $ WPDB; $ sql = ‘…’; $ resultados = $ wpdb-> get_results ($ sql, array_a); static :: $ suscripciones [$ user_id] = $ resultados; Devolver $ resultados;
}} El caché tiene una vida de la demanda, más precisamente la del tribunal.Si observa los resultados de los interrogatorios persistentes entre las solicitudes, debe implementar un objeto persistente.Sin embargo, su código debe ser responsable de establecer caché e invalidar la memoria caché cuando cambia los datos base.Pensando libremente, hay otros enfoques que podemos tomar para tratar de acelerar la ejecución de la consulta, lo que implica un poco más de trabajo que el mero ajuste de la consulta o agregar un índice.Una de las partes más lentas de nuestra consulta es el trabajo realizado para unir las tablas para pasar de la identificación del cliente a la ID del producto y debemos hacerlo para cada cliente.¿Qué sucede si hacemos todo ese sindicato una vez para que podamos tomar los datos del cliente cuando los necesitemos?
Puede desnormizar los datos creando una tabla que almacene los datos de la licencia, junto con la ID de usuario y la ID del producto para todas las licencias y solo interrogue en su contra para un cliente en particular. Debe reconstruir la tabla utilizando los desencadenantes MySQL en Insertar/Update/Eliminar en la tabla de licencias (u otros, dependiendo de cómo se puedan cambiar los datos), pero esto mejoraría significativamente el rendimiento del interrogatorio de esos datos. Del mismo modo, si un número de unión se ralentiza en MySQL, puede ser más rápido dividir la consulta en dos o más instrucciones y ejecutarlas por separado en el PHP y luego recopilar y filtrar los resultados en el código. Laravel hace algo similar a través de las relaciones de carga elocuentes. WordPress puede ser propenso a una consulta más lenta en la tabla WP_Posts, si tiene una gran cantidad de datos y muchos tipos diferentes de publicaciones personalizadas. Si encuentra que los interrogatorios para su tipo de publicación son lentos, considere la transición del modelo de almacenamiento de tipo de publicación personalizado y una tabla personalizada. Recientemente hemos descubierto que la consulta se está volviendo más lenta debido al tamaño creciente de nuestra tabla postmeta (actualmente, en 2.5 millones de filas). Debido a que la consulta se une dos veces en esa mesa para la identificación del cliente y una vez para la identificación del producto, decidimos eliminar una de las alegrías. Ya almacenamos “Software_Product_ID” en la tabla de licencias, que es una representación en una fila del producto para el cual la licencia es, por ejemplo. WPMDB-DEV para la licencia de desarrollador de WP Migra DB Pro.
Copyright statement: Unless otherwise noted, this article is Collected from the Internet, please keep the source of the article when reprinting.