如何优化这个wordpress mysql查询?

时间:2013-03-16 21:54:12

标签: mysql wordpress query-optimization

我从xml文件导入到wordpress数据库。我将城镇和地点作为每个帖子的元值导入。

我没有城镇和地点的预定清单,所以我需要获取所有地点(简单的事情)并获得这些地点内的所有城镇(我在这里遇到问题)

我现在的查询是:

SELECT t1.meta_value 
FROM wp_postmeta t1  
INNER JOIN wp_postmeta t2 ON (t1.post_id = t2.post_id) 
WHERE t2.meta_key = '_prop_loc'
    AND t2.meta_value="Málaga" 
    AND t1.meta_key = '_prop_town' 
GROUP BY t1.meta_value

例如,如果我试图获取“Málaga”位置的所有城镇,我结束使用此查询。在localhost上测试它运行查询

showing records 0 - 29 ( 101 total, total time 1.3289 seg)

如果我按时间减少取出组,但当然我会得到重复的行。如果我在订单ASC中使用select distinct,则时间会再次上升。

我确实想要对结果进行排序,但查询超过一秒钟就不行了

wp_postmeta表:

CREATE TABLE `wp_postmeta` (
  `meta_id`    bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `post_id`    bigint(20) unsigned NOT NULL DEFAULT '0',
  `meta_key`   varchar(255) DEFAULT NULL,
  `meta_value` longtext,
  PRIMARY KEY            (`meta_id`),
          KEY `post_id`  (`post_id`),
          KEY `meta_key` (`meta_key`)
) ENGINE=***  DEFAULT CHARSET=utf8;

1 个答案:

答案 0 :(得分:2)

我假设您没有在默认WP设计上添加任何其他索引。

您可以在(meta_key, meta_value, post_id)

上添加索引

(meta_key, post_id, meta_value)上的一个。

更新meta_valuetext列,因此这不是一个选项。您可以尝试在该列上创建第一个部分索引,而不是将其包含在第二个索引中:

ALTER TABLE wp_postmeta 
  ADD INDEX meta_key__meta_value__post_id__IX
    (meta_key, meta_value(20), post_id),
  ADD INDEX meta_key__post_id__IX
    (meta_key, post_id) ;

您也可以尝试重写查询:

SELECT t1.meta_value 
FROM wp_postmeta t1  
WHERE t1.meta_key = '_prop_town'
  AND EXISTS
      ( SELECT *
        FROM wp_postmeta t2 
        WHERE t2.meta_key = '_prop_loc'
          AND t2.meta_value = "Málaga" 
          AND t2.post_id = t1.post_id
      ) 
GROUP BY t1.meta_value ;