Estoy ejecutando una consulta en una base de datos relativamente pequeña (10 000 filas en wp_posts y 100 000 filas en wp_postmets) pero, por algún motivo, la consulta tarda entre 5 y 7 segundos en ejecutarse.
Los argumentos que paso a wp_query son;
Array(
[post_type] => post
[post_status] => publish
[ignore_sticky_posts] => 0
[posts_per_page] => 1
[orderby] => rand
[meta_key] =>
[meta_value] =>
[order] => DESC
[offset] => 0
[post__not_in] => Array
(
)
[author__in] => Array
(
)
[tax_query] => Array
(
[relation] => AND
[0] => Array
(
[taxonomy] => category
[field] => slug
[terms] => Array
(
[0] => beauty
)
[operator] => IN
[include_children] => 0
)
)
[meta_query] => Array
(
[relation] => OR
[0] => Array
(
[key] => sponsored
[value] => 1
[compare] => !=
[type] => CHAR
)
[1] => Array
(
[key] => sponsored
[value] =>
[compare] => NOT EXISTS
[type] => CHAR
)
)
)
Y la consulta SQL que ejecuta es;
SELECT SQL_CALC_FOUND_ROWS wp_posts.id
FROM wp_posts
LEFT JOIN wp_term_relationships
ON ( wp_posts.id = wp_term_relationships.object_id )
LEFT JOIN wp_postmeta
ON ( wp_posts.id = wp_postmeta.post_id )
LEFT JOIN wp_postmeta AS mt1
ON ( wp_posts.id = mt1.post_id
AND mt1.meta_key = 'sponsored' )
WHERE 1 = 1
AND ( wp_term_relationships.term_taxonomy_id IN ( 3 ) )
AND ( ( wp_postmeta.meta_key = 'sponsored'
AND wp_postmeta.meta_value != '1' )
OR mt1.post_id IS NULL )
AND wp_posts.post_type="post"
AND (( wp_posts.post_status="publish" ))
GROUP BY wp_posts.id
ORDER BY Rand()
LIMIT 0, 1
He notado que el problema de la consulta larga se resuelve solo cuando elimino esta parte;
Array(
[key] => sponsored
[value] =>
[compare] => NOT EXISTS
[type] => CHAR
)
Que en la consulta SQL es;
OR mt1.post_id IS NULL
Lo que intento hacer es buscar artículos que estén marcados como sponsored == 0
o donde no están marcados como patrocinados o no patrocinados (la meta_clave patrocinada no existe).
¿Puede alguien señalarme/ayudarme con cómo puedo lograr los mismos resultados con una consulta/wp_query más eficiente? O si me puede dar una idea de por qué OR mt1.post_id IS NULL
hace que la consulta se ejecute durante ~ 5 a 7 segundos, mientras que sin ella la consulta tarda ~ 20 milisegundos?
.