基于POST_META的有效查询方式是什么?

时间:2012-10-18 作者:tyler

我遇到的问题是,当我允许用户过滤帖子时,它会压倒数据库,而且运行速度非常慢。我不确定使用元数据查询帖子的最佳方式是什么。我的网站有一个表单,用户可以根据包含元值的复选框提交以过滤帖子。我目前有一个网站在为单个post\\u元键选择的复选框中创建一个数组,如下所示:

for ($i=0; $i< count($amenities); $i++)//where $amenities is an array of selected checkbox values

    {        //$arrays is the array that stores the arrays of checkboxes for different meta keys
        $count = count($arrays);
        $arrays[$count] = array(
                    \'key\' => \'amenities\',
                    \'value\' => $amenities[$i],
                    \'compare\' => \'LIKE\'
                    );
    }
然后,我使用一个数组来查询数据库,其中包含为每个meta\\u键选择的值。像这样:

$the_query = new WP_Query(array(
        \'post_type\' => \'listing\',
        \'post_status\' => \'publish\', 
        \'category_name\' => \'private_rental\',
        \'orderby\' => \'rand\',
        \'meta_query\' => $arrays
    ));
当我这样做的时候,我得到了我想要的结果,但结果显示在屏幕上可能需要一分钟。有没有更有效的方法?

任何帮助都将不胜感激!

2 个回复
SO网友:s_ha_dum

我想看看实际生成的SQL是什么WP_Query 正在使用,但现在。

(您可以使用http://wordpress.org/extend/plugins/debug-bar/ 轻松查看SQL查询)

按“随机”排序的查询效率很低。如果不需要,请将其删除。如果您确实需要一个随机顺序,请考虑删除它并使用PHP的shuffle 随机化。

LIKE 查询效率也相当低。使用= 如果可以的话。

您可以更快地编写自己的查询,将post ID从POSTETA表中提取出来,然后使用WP_Query 用一个简单的post__in 用于提取帖子内容的参数。这可能有帮助,也可能没有帮助,但值得一试。

SO网友:Manny Fleurmond

通过使用元查询,可以减轻服务器的负载IN:

$the_query = new WP_Query(array(
        \'post_type\' => \'listing\',
        \'post_status\' => \'publish\', 
        \'category_name\' => \'private_rental\',
        \'orderby\' => \'rand\',
        \'meta_query\' => array(
                    \'key\' => \'amenities\',
                    \'value\' => $amenities,
                    \'compare\' => \'IN\'
                    );
    ));
您尝试执行的查询看起来很复杂,这可能导致服务器负载过大。IN 基本上会查找所有包含关键字元数据的帖子amenities 在用户要查找的字段中具有值的。绝对是一个更有效的查询,imho

结束

相关推荐

使用自定义表从WordPress页面查询MySQL

我想要一个匹配页面标题的mysql查询。我不确定有没有更好的方法来完成这项任务,但我被卡住了。这是我的基本测试代码。<?php $page_title = wp_title(\'\'); echo $page_title; $test = $wpdb->get_results(\"SELECT * FROM $wpdb->park_data WHERE park_name = \'\"$page_title\"\' \") or die(mysql_error()