2

WordPress データベースからレポートを取得するクエリを作成しました。クエリが信じられないほど遅いので、最適化したい。私は少し調査を行いましたが、クエリを高速化する最善の方法を理解するのに苦労しています (これは、私が書いたにもかかわらず、私が何をしたかをほとんど理解していません)。クエリが遅い。

SELECT
wp1.meta_value as firstName,
wp2.meta_value as middleName,
wp3.meta_value as lastName,
wp5.meta_value as email2,
wp6.meta_value as address,
wp7.meta_value as city,
wp8.meta_value as state,
wp9.meta_value as zip,
wp10.meta_value as country,
wp11.meta_value as phone,
wp12.meta_value as dateOfBirth
FROM wp99_usermeta wp1
JOIN wp99_usermeta wp2 ON wp1.user_id = wp2.user_id and wp2.meta_key = 'middle_name'
JOIN wp99_usermeta wp3 ON wp1.user_id = wp3.user_id and wp3.meta_key = 'last_name'
JOIN wp99_usermeta wp5 ON wp1.user_id = wp5.user_id and wp5.meta_key = 'email2'
JOIN wp99_usermeta wp6 ON wp1.user_id = wp6.user_id and wp6.meta_key = 'street_address'
JOIN wp99_usermeta wp7 ON wp1.user_id = wp7.user_id and wp7.meta_key = 'city'
JOIN wp99_usermeta wp8 ON wp1.user_id = wp8.user_id and wp8.meta_key = 'state'
JOIN wp99_usermeta wp9 ON wp1.user_id = wp9.user_id and wp9.meta_key = 'zip'
JOIN wp99_usermeta wp10 ON wp1.user_id = wp10.user_id and wp10.meta_key = 'country'
JOIN wp99_usermeta wp11 ON wp1.user_id = wp11.user_id and wp11.meta_key = 'phone'
JOIN wp99_usermeta wp12 ON wp1.user_id = wp12.user_id and wp12.meta_key = 'date_of_birth'
WHERE wp1.meta_key = 'first_name' 

デフォルトのwp_usermetaテーブル構造:

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

ALTER TABLE の提案を試しています。これにより、5行目でエラーが発生します

ALTER TABLE wp99_usermeta ADD INDEX meta_key__user_id (meta_key, user_id) ;

SELECT
wp1.meta_value as firstName,
wp2.meta_value as middleName,
wp3.meta_value as lastName,
wp5.meta_value as email2,
wp6.meta_value as address,
wp7.meta_value as city,
wp8.meta_value as state,
wp9.meta_value as zip,
wp10.meta_value as country
FROM wp99_usermeta wp1
JOIN wp99_usermeta wp2 ON wp1.user_id = wp2.meta_key__user_id = 'middle_name'
JOIN wp99_usermeta wp3 ON wp1.user_id = wp3.meta_key__user_id = 'last_name'
JOIN wp99_usermeta wp5 ON wp1.user_id = wp5.meta_key__user_id = 'email2'
JOIN wp99_usermeta wp6 ON wp1.user_id = wp6.meta_key__user_id = 'street_address'
JOIN wp99_usermeta wp7 ON wp1.user_id = wp7.meta_key__user_id = 'city'
JOIN wp99_usermeta wp8 ON wp1.user_id = wp8.meta_key__user_id = 'state'
JOIN wp99_usermeta wp9 ON wp1.user_id = wp9.meta_key__user_id = 'zip'
JOIN wp99_usermeta wp10 ON wp1.user_id = wp10.meta_key__user_id = 'country'
WHERE wp1.meta_key = 'first_name' 
4

2 に答える 2

1

に化合物を追加し(meta_key, user_id)ます:

ALTER TABLE wp99_usermeta
    ADD INDEX meta_key__user_id 
      (meta_key, user_id) ;

上記の追加により、既存の(meta_key)インデックスは冗長になり、削除できます。しかし、@biziclop は、これがプラグインや WordPress の自己更新 (データベース) 手順に干渉する可能性を指摘しています。そのため、そのままにして、WordPress 開発者フォーラムでインデックスの追加/削除の影響/問題について質問することもできます。

于 2012-10-21T21:08:35.307 に答える
1

次を使用して、いくつかの楽しみを試すことができますGROUP BY

SELECT
  MAX( IF( meta_key = 'first_name', meta_value , NULL ) AS firstName,
  MAX( IF( meta_key = 'last_name',  meta_value , NULL ) AS lastName,
  ...
FROM wp99_usermeta
GROUP BY user_id

エンティティをフィルタリングする必要がある場合は、同様のことができます。

SELECT
  MAX( IF( b.meta_key = 'first_name', b.meta_value , NULL ) AS firstName,
  MAX( IF( b.meta_key = 'last_name',  b.meta_value , NULL ) AS lastName,
  ...
FROM wp99_usermeta a
JOIN wp99_usermeta b
WHERE a.meta_key = 'first_name'
  AND a.meta_value = 'Joe'
GROUP BY user_id
于 2012-10-21T21:20:41.280 に答える