我在网上和这里读了很多关于stackoverflow的教程,但是我仍然不知道如何解决我现在面临的问题。
我想告诉你们,我是mysql的新手,所以请原谅我的无知。
好的,查询就是这个,它从wordpress数据库中获取我需要的信息
SELECT
product.ID productId,
product.guid productLink,
product.post_title productTitle,
post.ID postId,
post.post_title postTitle,
post.post_content postContent,
post.post_date postDate,
tm.slug typeSlug, tm.name typeName,
tm2.slug langSlug, tm2.name langName,
tm3.slug pubSlug, tm3.name pubName,
IFNULL(wl.id,0) wishlist
FROM wp_posts product
JOIN wp_postmeta meta ON meta.meta_key = 'p2m' AND meta.meta_value=product.ID
JOIN wp_posts post ON post.ID = meta.post_id
JOIN wp_term_relationships tr ON tr.object_id = product.ID
JOIN wp_term_taxonomy tt ON tt.term_taxonomy_id = tr.term_taxonomy_id AND tt.taxonomy = 'mtype'
JOIN wp_terms tm ON tm.term_id = tt.term_id
JOIN wp_term_relationships tr2 ON tr2.object_id = product.ID
JOIN wp_term_taxonomy tt2 ON tt2.term_taxonomy_id = tr2.term_taxonomy_id AND tt2.taxonomy = 'language'
JOIN wp_terms tm2 ON tm2.term_id = tt2.term_id
JOIN wp_term_relationships tr3 ON tr3.object_id = product.ID
JOIN wp_term_taxonomy tt3 ON tt3.term_taxonomy_id = tr3.term_taxonomy_id AND tt3.taxonomy = 'publisher'
JOIN wp_terms tm3 ON tm3.term_id = tt3.term_id
LEFT JOIN wp_yith_wcwl wl ON wl.user_id = 1 AND wl.prod_id = product.ID AND wl.post_id = post.ID
WHERE product.post_type = 'product'
ORDER BY post.post_date DESC LIMIT 0,35
当我删除“order by post.post\u date desc”时,查询的速度降到了0.03秒,真是不可思议。。但是添加了“order by post.post_date desc”后,查询的速度达到了惊人的10秒以上,这太长了。。
我使用了explain,当orderbydate进入查询时,似乎使用了filesort。
我需要让我的查询回复结果根据后\的日期,所以我不知道我可以在这一点上做什么。。。
此外,我想指出的是,在wordpress的数据库描述中有一个索引,称为“type\u status\u date”,可以在我的例子中使用。然而,我完全不知道在哪里使用它和如何做。如果有人能指出我的查询逻辑中的缺陷或帮助我优化查询(或索引),请这样做。谢谢你的关心!
p、 s:我也不知道如何创建索引:)
按顺序解释的初始结果
3条答案
按热度按时间f2uvfpb91#
令人困惑。
JOIN...ON
用来表示两个表之间的关系。过滤器属于WHERE
:wp\u posteta没有很好的索引。这里有更多的讨论。
添加
INDEX(post_date)
可能对性能有帮助,也可能没有帮助——这取决于找到35个好行的速度。从
EXPLAIN
,我们看到最糟糕的部分是进入meta
--大概有3万行要看。据估计,有30行meta_key = 'p2m'
. 有几排?不幸的是
wp_postmeta
没有设计成有效地从meta\u键+meta\u值开始。这是键值存储(例如wp中的post)的一个普遍问题,尤其是当“value”是LONGTEXT
.8ljdwjyq2#
wp\u post上类型为\u status\u date的索引,其日期字段作为索引的第三个字段,
因此,您有一个post类型的 predicate ,但是post status不包含在任何 predicate 的查询中,因此它最多可以对索引进行部分索引扫描(有时称为跳过扫描或范围扫描,具体取决于数据库,我的sql不会轻易在这方面发挥作用),但速度会慢一些。
不过,这是一个最好的情况,因为索引没有覆盖所有这些连接和附加字段,所以索引扫描和行查找的成本可能太高,甚至无法考虑触及索引而不是直接扫描。
如果您发布解释计划,它将有助于确认优化器正在做什么。以上是更通用的db引擎注解。
h79rfbju3#
type\u status\u date是一个组合索引,因此仅当您按其所有组件排序时才使用它。mysql不能使用它来只按post\u日期进行订购。因此,最好的解决方案是按post\ date添加索引。