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

たとえば、「マラガ」の場所にあるすべての町を取得しようとすると、このクエリを使用して終了しました。クエリが実行されるローカルホストでテストする

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

時間が減少するまでにグループを取り出すと、もちろん行が重複します。オーダーASCで個別選択を使用すると、時間が再び上がります。

結果を順序付けしたいのですが、1 秒を超えるクエリは問題があります。

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)

と1つ(meta_key, post_id, meta_value)

更新meta_valuetext列であるため、これはオプションではありません。その列の最初の部分インデックスを作成し、2番目のインデックスに含めないようにすることができます。

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 に答える