你所看到的并不是“坏”的,你只是得到了一个非常劳动密集型的查询WP_Query
没有足够的智能来优化它--它甚至没有尝试。简单地说,你有很多JOIN
s、 你有两个LIKE
将读取该帖子类型表中每一行的条件OR
工作加倍的关系,你有很多比较--<=
-- 还将读取表中每一行的运算符。正如你所看到的,所有这些都会随着你增加的每一个条件而变得更糟。你也是ORDER
由两个价值观决定,这也是相当劳动密集型的。数据库引擎(不是WP_Query
) 将尽一切努力优化查询,但这是一个很难优化的查询,您的数据库服务器无法应对压力。
你必须设法帮助事情顺利进行。
我注意到以下几行:
AND ( mt2.meta_key = \'single_rooms\'
AND Cast(mt2.meta_value AS signed) >= \'3453\' )
AND ( mt3.meta_key = \'single_rooms\'
AND Cast(mt3.meta_value AS signed) <= \'345\' )
您没有发布查询参数,但我猜您有多个
meta_query
是这样的:
\'meta_query\' => array(
array(
\'key\' => \'single_room\',
\'value\' => \'3435\',
\'compare\' => \'>=\',
),
),
而不是像这样:
\'meta_query\' => array(
array(
\'key\' => \'single_room\',
\'value\' => array(3435,345),
\'compare\' => \'BETWEEN\',
),
),
这可能会减少
JOIN
s和加快速度
WP_Query
无法转换
BETWEEN
(这是一个有效的MySQL查询条件)。
不要对查询排序。稍后在PHP中执行此操作。我认为,您需要一个过滤器来完全删除排序,但至少不要在您的参数中添加更多的工作。
您可以防止SQL_CALC_FOUND_ROWS
通过添加\'no_found_rows\' => true
你的论点。这可以提高性能,但可能会打乱一些循环函数,所以请进行测试并注意。
如果这还不够,请查询postmeta
表中分别列出了post ID,并通过post__in
论点您必须编写自己的SQL。我所知的核心功能中没有以您需要的方式查询post meta的功能(这是我定期抱怨的核心故障)
除此之外,优化将意味着一些非常复杂的SQL。
最后一点注意:Learn to love EXPLAIN
.