我们正在使用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响应中的附件和标记,性能比以前略有提升,但我们仍然面临着慢速数据库查询的性能问题。 我们如何优化查询任何帮助。
答案 0 :(得分:0)
摆脱id
中的postmeta
并将PK更改为PRIMARY KEY(post_id, meta_key)
。
可以在不更改输出的情况下删除GROUP BY
的内容。
JSON与它有什么关系?