Wordpress MySQL查询执行时间太长

Wordpress MySQL查询执行时间太长,mysql,wordpress,database-design,entity-attribute-value,Mysql,Wordpress,Database Design,Entity Attribute Value,我使用的是WordPress4.4.2 我的问题是:在wordpress数据库中,我有一个Posteta表,其中包含大约314000条记录。当我试图执行以下查询(由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_relations

我使用的是
WordPress4.4.2

我的问题是:在wordpress数据库中,我有一个Posteta表,其中包含大约314000条记录。当我试图执行以下查询(由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
我检查了所有的东西,得出的结论是,主要的问题是在邮差表中。是否有任何解决方案可以加快查询的执行

解释输出:

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

显示创建表输出:

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(我必须预先打印才能理解它…)

如果可能,请清除第一个
hf\u postemta
。它似乎只是为订购提供
meta_值
,但您通过
mt1
获取相同的值

如果可能的话,摆脱hf_帖子。它似乎什么也没有提供。您可以使用已知相同的
r.object\u ID
,而不是
p.ID

3个表而不是5个表应该有助于提高性能

hf_Posteta中有3个冗余索引,但您甚至没有所需的两个索引:

INDEX(post_id, meta_key)
INDEX(meta_key, post_id)
hf\u术语\u关系
需求

INDEX(term_taxonomy_id, object_id)
INDEX(object_id, term_taxonomy_id)
(我得把它打印出来才能理解…)

如果可能,请清除第一个
hf\u postemta
。它似乎只是为订购提供
meta_值
,但您通过
mt1
获取相同的值

如果可能的话,摆脱hf_帖子。它似乎什么也没有提供。您可以使用已知相同的
r.object\u ID
,而不是
p.ID

3个表而不是5个表应该有助于提高性能

hf_Posteta中有3个冗余索引,但您甚至没有所需的两个索引:

INDEX(post_id, meta_key)
INDEX(meta_key, post_id)
hf\u术语\u关系
需求

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

explain select…
对这个查询说了什么,请把它添加到问题中。唉,您正在找出EAV模式糟糕的一个原因。也许如果您为相关表提供
SHOW CREATE TABLE
,我们可以找到一些局部修复方法。@AbhikChakraborty我编辑了question@RickJames我编辑了这个问题。这个查询看起来不错,它使用了索引,这可能是其他问题。
explain select…
对这个查询说了什么,请将此添加到问题中。唉,您正在找到EAV模式糟糕的一个原因。也许如果您为相关表提供
SHOW CREATE TABLE
,我们可以找到一些局部修复方法。@AbhikChakraborty我编辑了question@RickJames我编辑了这个问题。这个查询看起来不错,它使用了索引,这可能是其他问题。