【发布时间】:2021-04-25 11:01:34
【问题描述】:
发现问题:
仅通过删除 ORDER BY 子句,我就能将响应时间从 1.1 秒显着减少到不到 0.01 秒。
无论如何,我在 PHP 中对日期进行了 USORT,因为后处理会按匹配类型对帖子重新排序,因此 ORDER BY 子句是不必要的。
Larry Lustig 描述的查询对于整数来说非常快。正是字符串日期的排序导致了严重的性能问题。
希望此服务器作为一个很好的例子来说明如何将条件应用于多行以及为什么要注意涉及字符串的数据库操作。
原始问题(为清晰而编辑):
我正在使用关键字词干进行索引搜索。我希望对其进行更多优化。
Larry Lustig 的回答在如何创建查询以方便扩展方面帮助了我很多:
SQL for applying conditions to multiple rows in a join
关于如何优化此示例查询以更快运行的任何建议?我猜可能有一种方法可以对所有“s{x).post_id = p.ID”条件进行一次连接。
SELECT p.ID, p.post_title, LEFT ( p.post_content, 800 ), p.post_date
FROM wp_posts AS p
WHERE p.post_status = 'publish' AND ( ( (
( EXISTS ( SELECT s0.post_id FROM wp_rama_search_index AS s0
WHERE s0.post_id = p.ID AND s0.hash = -617801035 ) )
) OR (
( EXISTS ( SELECT s1.post_id FROM wp_rama_search_index AS s1
WHERE s1.post_id = p.ID AND s1.hash = 1805184399 )
AND EXISTS ( SELECT s2.post_id FROM wp_rama_search_index AS s2
WHERE s2.post_id = p.ID AND s2.hash = 1823159221 )
AND EXISTS ( SELECT s3.post_id FROM wp_rama_search_index AS s3
WHERE s3.post_id = p.ID AND s3.hash = 1692658528 ) )
) OR (
( EXISTS ( SELECT s4.post_id FROM wp_rama_search_index AS s4
WHERE s4.post_id = p.ID AND s4.hash = 332583789 ) )
) OR (
( EXISTS ( SELECT s5.post_id FROM wp_rama_search_index AS s5
WHERE s5.post_id = p.ID AND s5.hash = 623525713 ) )
) OR (
( EXISTS ( SELECT s6.post_id FROM wp_rama_search_index AS s6
WHERE s6.post_id = p.ID AND s6.hash = -2064050708 )
AND EXISTS ( SELECT s7.post_id FROM wp_rama_search_index AS s7
WHERE s7.post_id = p.ID AND s7.hash = 1692658528 ) )
) OR (
( EXISTS ( SELECT s8.post_id FROM wp_rama_search_index AS s8
WHERE s8.post_id = p.ID AND s8.hash = 263456517 )
AND EXISTS ( SELECT s9.post_id FROM wp_rama_search_index AS s9
WHERE s9.post_id = p.ID AND s9.hash = -1214274178 ) )
) OR (
( EXISTS ( SELECT s10.post_id FROM wp_rama_search_index AS s10
WHERE s10.post_id = p.ID AND s10.hash = -2064050708 )
AND EXISTS ( SELECT s11.post_id FROM wp_rama_search_index AS s11
WHERE s11.post_id = p.ID AND s11.hash = -1864773421 ) )
) OR (
( EXISTS ( SELECT s12.post_id FROM wp_rama_search_index AS s12
WHERE s12.post_id = p.ID AND s12.hash = -1227797236 ) )
) OR (
( EXISTS ( SELECT s13.post_id FROM wp_rama_search_index AS s13
WHERE s13.post_id = p.ID AND s13.hash = 1823159221 )
AND EXISTS ( SELECT s14.post_id FROM wp_rama_search_index AS s14
WHERE s14.post_id = p.ID AND s14.hash = -1214274178 ) )
) OR (
( EXISTS ( SELECT s15.post_id FROM wp_rama_search_index AS s15
WHERE s15.post_id = p.ID AND s15.hash = 323592937 ) )
) OR (
( EXISTS ( SELECT s16.post_id FROM wp_rama_search_index AS s16
WHERE s16.post_id = p.ID AND s16.hash = 322413837 ) )
) OR (
( EXISTS ( SELECT s17.post_id FROM wp_rama_search_index AS s17
WHERE s17.post_id = p.ID AND s17.hash = 472301092 ) ) ) ) )
ORDER BY p.post_date DESC
此查询从 phpMyAdmin 连接到大型 AWS Aurora 数据库实例运行大约 1.1 秒。
有 35,000 个已发布的帖子。帖子标题中的单词和帖子内容的摘录使用 FVN1A32 变形和散列。
“AND”操作表示两个哈希必须匹配的短语。有几个哈希值,因为正在使用关键字词干,并且关键字的别名也可以是短语。
【问题讨论】:
-
具有多个除数的关系除法以防万一有人想知道...
-
尝试
AND s0.hash IN ( ........ )LIMIT 1` 并列出那里的所有哈希值。那么你只需要一个子查询。 -
你有 danblack 的例子吗?
-
这是什么
wp_rama_search_index表?你使用搜索插件吗?哪一个?
标签: mysql wordpress search optimization query-optimization