1

我真的对 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);        

我想要做的是用自定义查询选择替换上面的代码,我读过它比 WP_Query 快得多

但我对 MySQL 或 WP 数据库的了解不够,无法构建自定义选择查询。任何人都可以帮忙吗?提前致谢!

4

1 回答 1

0

在您链接自己的帖子中,第一个回复已经指出

[...] 默认模式甚至在 value 列上都没有索引

这比使用查询生成器遇到的问题要严重得多,因为没有索引,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
..

(未经测试。我实际上从未这样做过,参考

与我假设的添加索引相比,性能提升可以忽略不计,但您的代码会变得简单得多。

于 2012-09-02T06:10:20.550 回答