非常慢的order by查询

jexiocij  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(441)

我在网上和这里读了很多关于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:我也不知道如何创建索引:)
按顺序解释的初始结果

f2uvfpb9

f2uvfpb91#

JOIN wp_postmeta meta
       ON meta.meta_key = 'p2m'       -- filters
      AND meta.meta_value=product.ID  -- shows relation

令人困惑。 JOIN...ON 用来表示两个表之间的关系。过滤器属于 WHERE :

WHERE ...
      AND meta.meta_key = 'p2m'
      ...

wp\u posteta没有很好的索引。这里有更多的讨论。
添加 INDEX(post_date) 可能对性能有帮助,也可能没有帮助——这取决于找到35个好行的速度。
EXPLAIN ,我们看到最糟糕的部分是进入 meta --大概有3万行要看。据估计,有30行 meta_key = 'p2m' . 有几排?
不幸的是 wp_postmeta 没有设计成有效地从meta\u键+meta\u值开始。这是键值存储(例如wp中的post)的一个普遍问题,尤其是当“value”是 LONGTEXT .

8ljdwjyq

8ljdwjyq2#

wp\u post上类型为\u status\u date的索引,其日期字段作为索引的第三个字段,

type_status_date INDEX 
post_type
post_status
post_date
ID

因此,您有一个post类型的 predicate ,但是post status不包含在任何 predicate 的查询中,因此它最多可以对索引进行部分索引扫描(有时称为跳过扫描或范围扫描,具体取决于数据库,我的sql不会轻易在这方面发挥作用),但速度会慢一些。
不过,这是一个最好的情况,因为索引没有覆盖所有这些连接和附加字段,所以索引扫描和行查找的成本可能太高,甚至无法考虑触及索引而不是直接扫描。
如果您发布解释计划,它将有助于确认优化器正在做什么。以上是更通用的db引擎注解。

h79rfbju

h79rfbju3#

type\u status\u date是一个组合索引,因此仅当您按其所有组件排序时才使用它。mysql不能使用它来只按post\u日期进行订购。因此,最好的解决方案是按post\ date添加索引。

相关问题