0

我从 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)

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

我确实希望对结果进行排序,但是超过一秒的查询是不行的

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;
4

1 回答 1

2

我假设您没有在默认的 WP 设计中添加更多索引。

您可以在上添加索引(meta_key, meta_value, post_id)

和一个(meta_key, post_id, meta_value)

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

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 ;
于 2013-03-16T23:44:28.247 回答