ผู้ดูแลระบบ: หน้าแก้ไขช้ามากที่เกิดจากแบบสอบถามเมตาหลัก


11

เราได้สังเกตเห็นการโหลดนานมากเมื่อไปแก้ไขโพสต์หรือหน้า เมื่อใช้ Query Monitor เราพบว่าแบบสอบถามหลัก 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()

เราใช้ postmeta เป็นจำนวนมากเนื่องจากหนึ่งในประเภทโพสต์ของเราใช้ฟิลด์ที่กำหนดเองประมาณ 20 รายการ ฉันอาจจะบอกว่าบางทีเราพึ่งพา postmeta มากเกินไป แต่นี่ดูเหมือนว่าเป็นคำถามที่ไม่มีประโยชน์มากเพราะเห็นว่ามันไม่ได้เลือก ID ของโพสต์

นี่เป็นปัญหาทั่วไปใช่ไหม มีวิธีปิดการใช้งานฟังก์ชั่นนี้ผ่านตัวกรองหรือไม่? ขอบคุณสำหรับการป้อนข้อมูลใด ๆ


สิ่งนี้เกิดขึ้นโดยไม่มีปลั๊กอินและชุดรูปแบบเริ่มต้นหรือไม่
Birgire

ใช่. ดังที่ได้กล่าวไว้ข้างต้นฉันได้ระบุการสืบค้นที่ช้าว่าเป็นของ Core WP ด้วยฟังก์ชั่นในคำตอบที่ฉันมีให้กล่องเมตาของฟิลด์ที่กำหนดเองถูกปิดใช้งานซึ่งทำให้ไม่สามารถเรียกใช้คิวรีได้
psorensen

2
ฉันเห็นมันรู้ฉันแค่ตรวจสอบmeta_form()ฟังก์ชั่นและนี่คือแบบสอบถาม SQL ที่สร้างขึ้นจากฟังก์ชันหลักนั้น คุณสามารถลองเพิ่ม metabox แบบกำหนดเองของคุณเองด้วยการแก้ไขโค้ดmeta_form()และใช้แบบสอบถาม SQL ที่แนะนำของคุณ ฉันพบตั๋ว Trac # 8561 ที่ปิดนี้ คุณอาจสร้างตั๋วอีกใบหรือลองเปิดใหม่ PS: ขอให้สังเกตว่าหน้าหลักที่เลือก metabox ก็เป็นปัญหาเช่นกัน หากคุณมี 1 ล้านหน้าทั้งหมดจะปรากฏเป็นตัวเลือกที่เลือก!
Birgire

2
วิธีแก้ปัญหาที่เสนอใน CSS-Tricks: css-tricks.com/ …
psorensen

มีวิธีแก้ปัญหาที่น่าสนใจ แต่ดูเหมือนว่ามันจะแทนที่meta_form()ฟังก์ชั่นทั้งหมด ฉันอัปเดตคำตอบ - แบบสอบถามหลักของ SQL ได้รับการปรับปรุงใน WP เวอร์ชัน 4.3 คุณเห็นการเพิ่มประสิทธิภาพของแบบสอบถาม SQL ใหม่นี้เมื่อเปรียบเทียบกับpost_idข้อ จำกัดเพิ่มเติมของเราหรือไม่
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_keyshook คุณสามารถระบุคีย์ด้วยตนเองเพื่อหลีกเลี่ยงการเรียกเคียวรีที่ไม่มีประสิทธิภาพนี้ไปด้วยกัน:

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

น่าสนใจ สิ่งนี้อยู่ที่ไหนในรหัสที่มา?
psorensen

wp-admin /
include

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.