관리자 : 핵심 메타 쿼리로 인한 편집 페이지 속도가 매우 느림


11

게시물이나 페이지를 편집 할 때로드 시간이 길다는 사실을 알고있었습니다. 쿼리 모니터를 사용하여이 WP 코어 쿼리가 15-20 초로 증가하고 있음을 발견했습니다.

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()

우리는 게시물 유형 중 하나가 약 20 개 정도의 사용자 정의 필드를 사용하기 때문에 많은 postmeta를 사용합니다. 나는 우리가 postmeta에 너무 많이 의존한다고 말하지만, 이것은 게시물의 ID를 선택하지 않는 것을 보는 매우 비효율적 인 쿼리처럼 보입니다.

이것이 일반적인 문제입니까? 필터를 통해이 기능을 비활성화하는 방법이 있습니까? 입력 해 주셔서 감사합니다.


플러그인과 기본 테마없이이 문제가 발생합니까?
birgire

그렇습니다. 위에서 언급했듯이 느린 쿼리는 WP 코어에 속하는 것으로 식별했습니다. 내가 제공 한 답변의 기능으로 사용자 정의 필드 메타 상자가 비활성화되어 쿼리가 실행되지 않습니다.
psorensen

2
나는 그것이 방금 meta_form()함수를 체크 아웃했다는 것을 알았다. 이것은 실제로 그 핵심 함수에서 생성 된 SQL 쿼리이다. 코드를 수정하여 사용자 지정 메타 박스를 추가 meta_form()하고 제안 된 SQL 쿼리를 사용할 수 있습니다. 이 # 8561 폐쇄 trac 티켓을 찾았 습니다. 다른 티켓을 만들거나 다시 열 수 있습니까? 추신 : 메타 박스를 선택하는 부모 페이지도 문제가 있습니다. 백만 페이지가 있으면 모든 옵션이 선택 옵션으로 표시됩니다!
birgire

2
CSS-트릭에 제안 해결책 : css-tricks.com/...
psorensen

흥미로운 해결책이 있지만 전체 meta_form()기능을 대체하는 것처럼 보입니다 . 핵심 SQL 쿼리가 WP 버전 4.3에서 조정되었습니다. 추가 post_id제한 과 비교하여이 새 SQL 쿼리의 성능 향상이 있습니까?
birgire

답변:


5

로드 시간에 미치는 영향을 확인하기 위해 사용자 지정 SQL을 테스트하려는 경우이 쿼리 스와핑을 시도 할 수 있습니다.

/**
 * 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;
    } );                                                            
} );

여기서 우리는 add_meta_boxes_{$post_type}후크를 사용합니다 $post_type = 'post'.

여기서 전체 쿼리를 교체하지만 동적 한계를 지원하도록 조정할 수도 있습니다.

바라건대 당신의 요구에 맞게 조정할 수 있습니다.

최신 정보:

이 잠재적으로 느린 SQL 코어 쿼리는 이제 WP 버전 4.3에서 조정되었습니다.

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

에:

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;

자세한 내용 은 코어 티켓 # 24498 을 확인하십시오 .


2

함수의 소스 코드를 탐색하면 다음을 찾을 수 있습니다.

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

postmeta_form_keys후크를 사용하면 이 비효율적 인 쿼리를 모두 호출하지 않도록 키를 수동으로 지정할 수 있습니다.

add_filter('postmeta_form_keys', function(){
    return ['your_meta_key'];
});

흥미 롭군 소스 코드의 어디에 존재합니까?
psorensen

wp-admin / includes / template.php : 595 4.4 기준
markdwhite

2

이것을 시도해 볼 수 있습니까? 이것은 해결책이 아니라 일시적인 해결 방법입니다.

// 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 );

-1

메타 박스를 제거하면 쿼리 속도가 느려집니다.

function remove_metaboxes() {
     remove_meta_box( 'postcustom', 'page', 'normal' );
}
add_action('admin_menu', 'remove_metaboxes');
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.