簡體   English   中英

Wordpress MySQL Query需要花費太多時間來執行

[英]Wordpress MySQL Query takes too much time to execute

我正在使用Wordpress 4.4.2

我的問題是:在wordpress數據庫中,我有一個約有314,000條記錄的postmeta表。 當我嘗試執行以下查詢(由wordpress構建)時,執行大約需要5-10秒。 我在單個頁面中有這樣的查詢,例如2 - 3次,因此執行單個頁面需要20 - 30秒:

SELECT hf_posts.ID
FROM hf_posts 
INNER JOIN hf_term_relationships
ON (hf_posts.ID = hf_term_relationships.object_id)

INNER JOIN hf_postmeta
ON ( hf_posts.ID = hf_postmeta.post_id ) 

INNER JOIN hf_postmeta AS mt1
ON ( hf_posts.ID = mt1.post_id ) 

INNER JOIN hf_postmeta AS mt2
ON ( hf_posts.ID = mt2.post_id )


WHERE 1=1 
AND ( hf_term_relationships.term_taxonomy_id IN (20) )
AND ( hf_postmeta.meta_key = 'match-date' 
AND ( ( mt1.meta_key = 'match-date'
AND CAST(mt1.meta_value AS SIGNED) >= '1460091523' ) 
AND ( mt2.meta_key = 'awaygame'
AND CAST(mt2.meta_value AS CHAR) = '0' ) ) )
AND hf_posts.post_type = 'match'
AND ((hf_posts.post_status = 'publish'
OR hf_posts.post_status = 'future'))
GROUP BY hf_posts.ID
ORDER BY hf_postmeta.meta_value ASC
LIMIT 0, 1

我檢查了一切,我得出結論,主要問題是在postmeta表中。 有沒有解決方案可以加快查詢的執行速度。

解釋輸出:

在此輸入圖像描述

SHOW CREATE TABLE OUTPUT:

CREATE TABLE `hf_postmeta` (
 `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
 `post_id` bigint(20) unsigned NOT NULL DEFAULT '0',
 `meta_key` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
 `meta_value` longtext COLLATE utf8_unicode_ci,
 PRIMARY KEY (`meta_id`),
 KEY `post_id` (`post_id`),
 KEY `meta_key` (`meta_key`(191)),
 KEY `meta_id` (`meta_id`),
 KEY `post_id_2` (`post_id`),
 KEY `meta_key_2` (`meta_key`),
 KEY `meta_key_3` (`meta_key`)
) ENGINE=InnoDB AUTO_INCREMENT=326766 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

期待看到你的回復。

此致,Chirag

(我不得不把它弄清楚了解它...)

SELECT  p.ID
    FROM  hf_posts AS p
    INNER JOIN  hf_term_relationships AS r ON (p.ID = r.object_id)
    INNER JOIN  hf_postmeta AS mt0 ON ( p.ID = mt0.post_id )
    INNER JOIN  hf_postmeta AS mt1 ON ( p.ID = mt1.post_id )
    INNER JOIN  hf_postmeta AS mt2 ON ( p.ID = mt2.post_id )
    WHERE  1=1
      AND  r.term_taxonomy_id IN (20)
      AND  mt0.meta_key = 'match-date'
      AND  mt1.meta_key = 'match-date'
      AND  CAST(mt1.meta_value AS SIGNED) >= '1460091523'
      AND  mt2.meta_key = 'awaygame'
      AND  CAST(mt2.meta_value AS CHAR) = '0'
      AND  p.post_type = 'match'
      AND  (      p.post_status = 'publish'
              OR  p.post_status = 'future'
           )
    GROUP BY  p.ID
    ORDER BY  mt0.meta_value ASC
    LIMIT  0, 1

如果可能的話,擺脫hf_postmeta的第一個實例。 似乎只有提供meta_value進行排序,但是你通過mt1獲取相同的值。

如果可能的話,擺脫hf_posts 它似乎什么都沒提供。 您可以使用r.object_id代替p.ID ,已知它是相同的。

3個表而不是5個應該有助於提高性能。

hf_postmeta中有3個冗余索引,但你甚至沒有你需要的兩個:

INDEX(post_id, meta_key)
INDEX(meta_key, post_id)

並且hf_term_relationships需要

INDEX(term_taxonomy_id, object_id)
INDEX(object_id, term_taxonomy_id)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM