我真的不太了解MySQL查询并且它正在显示。
我为每个帖子设置了自定义字段。自定义字段将帖子源URL存储在名为“source_url”的键中。
我使用下面的WP_Query参数,但是它非常慢。请记住,可以搜索50多个网址。
所以,给定一个源URL数组,我想获取匹配的帖子。
例如,以下是我目前在WP_Query中速度很慢的内容:
// var_dump of $urls array (this could be 50+ urls)
array(7) {
[0]=>
string(42) "http://www.youtube.com/watch?v=FMghvnqDhT8"
[1]=>
string(42) "http://www.youtube.com/watch?v=RY-yUFpXTnM"
[2]=>
string(58) "http://www.youtube.com/watch?v=nIm2dnyJ1Ps&feature=related"
[3]=>
string(42) "http://www.youtube.com/watch?v=NoCtRQlJAqM"
[4]=>
string(57) "http://holidaycustoms.blogspot.com/2012/08/busy-week.html"
[5]=>
string(42) "http://www.youtube.com/watch?v=DcZvg197Ie4"
[6]=>
string(42) "http://www.youtube.com/watch?v=7P3UEbLmLuo"
}
// Build Media Query
$meta_query = array(
'relation' => 'OR'
);
foreach( $urls as $url ) {
$meta_query[] = array(
'key' => 'source_url',
'value' => $url
);
}
// Get 20 matching posts from a category set by a variable
$args = array(
'post_type' => 'post',
'posts_per_page' => 20,
'orderby' => 'rand',
'cat' => $cat_ID,
'meta_query' => $meta_query
);
$posts = get_posts($args);
我要做的是用自定义查询选择which I have read is much faster than WP_Query替换上面的代码。
但我不太了解MySQL或WP数据库来构建自定义选择查询。有人可以帮忙吗?提前致谢!
答案 0 :(得分:0)
在您自己关联的帖子中,第一个回复已经说明了
[...]默认架构甚至没有值列
的索引
问题远远超过查询生成器的问题,因为没有索引,DBMS必须遍历整个表并比较每个字段的字符串。
使用PHPMyAdmin等适当的管理工具添加索引相当容易。您需要添加索引的违规表名为wp_postmeta
,需要索引的字段为meta_value
,索引类型应为INDEX
。
添加索引是透明的,除性能外不会影响wordpress。可能需要一些时间,因为MySQL需要遍历整个表。另外,因为您正在索引字符串数据,所以索引会非常大。
您还应该尝试为查询使用适当的结构。您当前正在使用具有不同值的大OR
ed选项,但始终使用相同的字段。只有那个构造,它被称为IN
。
...
// Build Media Query
$meta_query = array();
$meta_query[] = array(
'key' => 'source_url',
'value' => $urls,
'compare' => 'IN'
);
// Get 20 matching posts from a category set by a variable
..
(未经测试。我实际上从未这样做过,Reference)
与添加我假设的索引相比,性能提升可以忽略不计,但您的代码会变得更加简单。