【问题标题】:How do I optimize this query?如何优化此查询?
【发布时间】:2023-04-02 23:24:02
【问题描述】:
SELECT DISTINCT wposts.* 
    FROM wp_2_posts wposts, wp_2_postmeta wpostmeta, wp_2_postmeta wpostmeta1, wp_2_term_taxonomy, wp_2_terms, wp_2_term_relationships
    WHERE wposts.ID = wpostmeta.post_id
    AND wp_2_terms.term_id = '8'
    AND wp_2_term_taxonomy.term_id = wp_2_terms.term_id
    AND wp_2_term_taxonomy.term_taxonomy_id = wp_2_term_relationships.term_taxonomy_id
    AND wp_2_term_relationships.object_id = wposts.ID
    AND wpostmeta.meta_key = 'validity'
    AND wpostmeta.meta_value > '".$logic_date."'    
AND wpostmeta1.meta_key != 'permanent'  
    AND wposts.post_status = 'publish' 
    AND wposts.post_type = 'post'
    ORDER BY wposts.post_date DESC

到目前为止,这是一个很好的建议,“进化”查询仍然不使用第二个 meta_key != 'permanent_listing'

选择 wposts。* 从 wp_2_posts wposts 左加入 wp_2_postmeta wpostmeta ON wposts.ID = wpostmeta.post_id 左加入 wp_2_term_relationships wrelationships ON wrelationships.object_id = wposts.ID 左加入 wp_2_term_taxonomy wtaxonomy ON wtaxonomy.term_taxonomy_id = wrelationships.term_taxonomy_id 左加入 wp_2_terms wterms ON wtaxonomy.term_id = wterms.term_id 在哪里 wterms.term_id = '--此处的类别 id--' AND wpostmeta.meta_key = 'wpx_validity' 和 wpostmeta.meta_value > '--todays date here--' AND wpostmeta.meta_key != 'permanent_listing' AND wposts.post_status = '发布' AND wposts.post_type = '发布' 按 wposts.post_date DESC 排序

LEFT JOIN 和 INNER JOIN 似乎做同样的事情。 存在以下索引:wp_2_terms.term_id、wp_term_taxonomy.term_taxonomy_id、wp_2_term_relationships.object_id wp_2_postmeta 有一个 meta_id 索引,以及字段:post_id、meta_key、meta_value。

此查询正在 WPMU 上运行。

【问题讨论】:

  • 很慢吗?或者你想优化什么?
  • 好吧,您将 5 个表连接在一起......这可能是您的第一个问题。

标签: mysql


【解决方案1】:

首先我建议您使用 INNER JOIN 语法来连接表:

SELECT table1.c1, table2.c2 FROM table1
  INNER JOIN table2 ON table1.ck = table2.ck

此外,您应该避免使用 * 运算符并仔细选择您需要的列。 DISTINCT 也会减慢您的查询速度。你真的需要吗?

【讨论】:

  • 如果 op 将优化称为性能的同义词,那么我不确定 select 子句(使用 *)或 ANSI 连接中的列数量是否真的会影响性能。然而,Distinct 会。
【解决方案2】:

首先,您的wpostmeta1 没有加入任何内容。

其次,这里不需要DISTINCT,需要IN

试试这个:

SELECT  wposts.* 
FROM    wp_2_posts wposts
JOIN    wp_2_postmeta wpostmeta
ON      wpostmeta.post_id = wposts.ID
        AND wpostmeta.meta_key = 'validity'
        AND wpostmeta.meta_value > '".$logic_date."'
JOIN    wp_2_postmeta wpostmeta1,
ON      wpostmeta1.post_id = wposts.ID
        AND wpostmeta1.meta_key != 'permanent'  
WHERE   wposts.ID IN
        (
        SELECT  wp_2_term_relationships.object_id
        FROM    wp_2_term_relationships
        JOIN    wp_2_term_taxonomy
        ON      wp_2_term_taxonomy.term_taxonomy_id = wp_2_term_relationships.term_taxonomy_id
        WHERE   wp_2_term_taxonomy.term_id = '8'
        )
        AND wposts.post_status = 'publish' 
        AND wposts.post_type = 'post'
ORDER BYc
        wposts.post_date DESC

创建以下索引(或确保它们存在):

wp_2_term_relationships (object_id, term_taxonomy_id)
wp_2_term_taxonomy (term_taxonomy_id, term_id)
wp_2_posts (post_status, post_type, post_date, id)

【讨论】:

    【解决方案3】:

    如果查询太慢, 有不同的解决方案。

    首先尝试创建一些索引,

    然后尝试减少使用php过滤某些数据的连接。

    如果仍然很慢,可能是数据库架构错误,应该更改。

    【讨论】:

      【解决方案4】:

      我敢打赌 5 美元,这是一个索引问题。我要做的第一件事是确保要加入表格的所有字段都已编入索引。

      【讨论】:

        猜你喜欢
        • 2017-03-01
        • 1970-01-01
        • 2021-09-09
        • 2021-05-24
        • 1970-01-01
        相关资源
        最近更新 更多