Json API的响应时间很慢

时间:2017-04-28 13:19:11

标签: php mysql wordpress query-optimization json-api

我们正在使用JSON API插件,我们在其中面临App的性能问题。启动应用程序需要10-20秒的加载时间。

我们测试了Api请求,我们得到了结果,因为一些慢的SQL查询得到调用,如下所述。这个查询来自JSON API请求。

我们无法识别此sql查询从何处被触发,因为查询中提到的路径我们在post_type中进行了一些更改,例如我们从query.php中排除了post1 AND post2但是没有变化我们得到相同的导致数据库中的SQL查询速度慢。

SELECT  iqoyau1_posts.ID
    FROM  iqoyau1_posts
    INNER JOIN  iqoyau1_postmeta  ON ( iqoyau1_posts.ID = iqoyau1_postmeta.post_id )
    WHERE  1=1
      AND  ( 
            ( iqoyau1_postmeta.meta_key = '_hide-in-ipad'
                      AND  CAST(iqoyau1_postmeta.meta_value AS CHAR) = '1' 
            )
           )
      AND  iqoyau1_posts.post_type IN ('post1', 'post2', 'post3', 'post4',
                                       'post5)
      AND  ((iqoyau1_posts.post_status = 'publish'))
    GROUP BY  iqoyau1_posts.ID
    ORDER BY  iqoyau1_posts.post_date DESC /* in [/plugins/ipad-app/query.php:38] 

这是我们的query.php代码:

    <?php

    function pre_get_posts( $wp_query ){

    $json = $wp_query->get( 'json' );
    if( !$json )
        return $wp_query;
    $api_version = $wp_query->get( 'api_ver' );
    if( version_compare($api_version, '2.0', '<') ){
        $wp_query->query_vars['post_type'] =array( 'ipad-post' );
        $wp_query->query_vars['posts_per_page'] = 36;
    } 
    elseif( version_compare($api_version, '2.0', '>=') ){
    $url = $_SERVER['REQUEST_URI']; 
    if  ($_GET["post_type"]== "XXX" && strpos($url,'api_v2') ){
            $wp_query->query_vars['post_type'] =  'XXX';
        $wp_query->query_vars['posts_per_page'] = $_GET["count"];
        }else{
        $wp_query->query_vars['post_type'] = array( 'post3', 'post4','post5);
        $wp_query->query_vars['posts_per_page'] = $_GET["count"];
        }

        // exclude posts set to not show in ipad app
        $not_in = new \WP_Query( array(
            'fields' => 'ids',
            'meta_key' => '_hide-in-ipad',
            'meta_value' => 1,
            'posts_per_page' => -1
        ) );

        $wp_query->query_vars['post__not_in'] =
                array_merge( $not_in->posts, $wp_query->get('post__not_in') );
    }

    $wp_query->query_vars['ignore_sticky_posts'] = TRUE;
    return $wp_query;
}
add_filter( 'pre_get_posts', __NAMESPACE__.'\pre_get_posts' );

/*
*   allow post__not_in in query string with normal or json syntax
*   @param array
*   @return array
*/
function request( $qv ){
    if( !empty($qv['api_ver'])
      && version_compare($qv['api_ver'], '2.0', '>=')
      && !empty($_GET['post__not_in']) ){
        if( is_string($_GET['post__not_in']) )
            $qv['post__not_in'] = (array) json_decode( $_GET['post__not_in'] );
        elseif( is_array($_GET['post__not_in']) )
            $qv['post__not_in'] = $_GET['post__not_in'];

        $qv['post__not_in'] = array_map( 'intval', $qv['post__not_in'] );
    }

    return $qv;
   }
        add_filter( 'request', __NAMESPACE__.'\request' );

我们还优化了json响应中的附件和标记,性能比以前略有提升,但我们仍然面临着慢速数据库查询的性能问题。 我们如何优化查询任何帮助。

1 个答案:

答案 0 :(得分:0)

摆脱id中的postmeta并将PK更改为PRIMARY KEY(post_id, meta_key)

可以在不更改输出的情况下删除GROUP BY的内容。

JSON与它有什么关系?