Admin: página de edição muito lenta causada pela meta consulta principal

10

Temos notado tempos de carregamento muito longos quando editamos um post ou uma página. Usando o Query Monitor, descobrimos que essa consulta principal do WP está aumentando para 15-20s.

SELECT meta_key 
FROM wp_postmeta 
GROUP BY meta_key 
HAVING meta_key NOT LIKE '\_%' 
ORDER BY meta_key 
LIMIT 30

caller: 
meta_form()
post_custom_meta_box()
do_meta_boxes()

Nós usamos muito postmeta, já que um de nossos tipos de postagem usa cerca de 20 ou mais campos personalizados. Eu diria que talvez dependamos muito de postmeta, mas isso parece ser uma consulta muito ineficiente, visto que nem mesmo é selecionado o ID do post.

Isso é um problema comum? Existe uma maneira de desativar essa função através de um filtro? Obrigado por qualquer entrada.

    
por psorensen 07.05.2015 / 18:13

4 respostas

5

Se você quiser testar seu SQL personalizado para ver como isso afeta o tempo de carregamento, tente essa troca de consulta:

/**
 * Restrict the potential slow query in the meta_form() to the current post ID.
 *
 * @see http://wordpress.stackexchange.com/a/187712/26350
 */

add_action( 'add_meta_boxes_post', function( $post )
{
    add_filter( 'query', function( $sql ) use ( $post )
    {
        global $wpdb;
        $find = "SELECT meta_key
                 FROM $wpdb->postmeta
                 GROUP BY meta_key 
                 HAVING meta_key NOT LIKE '\\_%'
                 ORDER BY meta_key 
                 LIMIT 30";
        if(    preg_replace( '/\s+/', ' ', $sql ) === preg_replace( '/\s+/', ' ', $find )
            && $post instanceof WP_Post  
        ) {
            $post_id = (int) $post->ID;
            $sql  = "SELECT meta_key
                     FROM $wpdb->postmeta
                     WHERE post_id = {$post_id}
                     GROUP BY meta_key
                     HAVING meta_key NOT LIKE '\\_%'
                     ORDER BY meta_key
                     LIMIT 30";
        }
        return $sql;
    } );                                                            
} );

Aqui usamos o add_meta_boxes_{$post_type} hook, onde $post_type = 'post' .

Aqui nós trocamos toda a consulta, mas também poderíamos ajustá-la para suportar o limite dinâmico.

Espero que você possa ajustar isso às suas necessidades.

Atualização:

Esta consulta de núcleo SQL potencialmente lenta foi agora ajustada no WP versão 4.3 de

SELECT meta_key 
FROM wp_postmeta 
GROUP BY meta_key 
HAVING meta_key NOT LIKE '\_%' 
ORDER BY meta_key 
LIMIT 30

para:

SELECT DISTINCT meta_key
FROM wp_postmeta
WHERE meta_key NOT BETWEEN '_' AND '_z'
HAVING meta_key NOT LIKE '\_%'
ORDER BY meta_key
LIMIT 30;

Confira o tíquete principal # 24498 para obter mais informações.

    
por birgire 08.05.2015 / 11:51
2

Se você navegar pelo código fonte da função, você encontrará isto:

$keys = apply_filters( 'postmeta_form_keys', null, $post );
if ( null === $keys ) {
    ...      
}

Usando o gancho postmeta_form_keys , você pode especificar manualmente as chaves para evitar chamar completamente essa consulta ineficiente:

add_filter('postmeta_form_keys', function(){
    return ['your_meta_key'];
});
    
por Dan K 13.07.2016 / 21:29
1

Você pode tentar isso? Isso não é uma solução, mas uma solução temporária.

// disable big slowdown http://wordpress.stackexchange.com/questions/187612/admin-very-slow-edit-page-caused-by-core-meta-query
function dj_limit_postmeta( $string, $post ) {
    return array(null);
}
add_filter( 'postmeta_form_keys', 'dj_limit_postmeta', 10, 3 );
    
por prosti 27.09.2016 / 23:30
-1

Remover os metaboxes também evita a consulta lenta.

function remove_metaboxes() {
     remove_meta_box( 'postcustom', 'page', 'normal' );
}
add_action('admin_menu', 'remove_metaboxes');
    
por psorensen 07.05.2015 / 18:32

Tags