[英]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.