Mysql

如何通過連接提高性能以從 Wordpress wp_usermeta 創建 VIEW

  • October 20, 2017

經過大量搜尋,我終於能夠創建一個 SQL 查詢來檢索 Wordpress 使用者元數據。現在的問題是,性能太差了,30 分鐘後甚至都沒有顯示結果。

Wordpress 將數據儲存在 3 列中:user_idmeta_keymeta_value。所以每個條目都有一行。我需要的是每個使用者一行,每個使用者都有meta_key自己的列。

換句話說,我有這個:

user_id | meta_key | meta_value
      1|Name      |David
      1|Lastname  |Brown

但我需要這個:

user_id|Name |Lastname
     1|David|Brown

我對此的做法是:

select m1.user_id, m1.meta_value as Vorname_M, m2.meta_value as Nachname_M,m3.meta_value as Adresse_M
from wp_usermeta m1
join wp_usermeta m2 on (m1.user_id = m2.user_id and m2.meta_key =  'nachname')
join wp_usermeta m3 on (m2.user_id = m3.user_id and m3.meta_key = 'adress')
where m1.meta_key = 'vorname'

有 5 個連接它仍然可以工作,但已經需要 4 秒。總而言之,實際上有 17 個連接,此時它沒有向我顯示任何內容。

我在 phpMyAdmin 中執行查詢,並希望從結果中創建一個 VIEW。

現在實際的問題是:如何提高查詢的性能,或者如何重寫它?我盡力而為,但實際上我是 SQL 的初學者。

MySql 版本:5.5

在這種情況下,您不需要將表連接到自身。如果你只查詢一次,那麼它會更快。

SELECT user_id, 
   MAX(CASE WHEN meta_key='vorname' THEN meta_value ELSE null END) Vorname_M,
   MAX(CASE WHEN meta_key='nachname' THEN meta_value ELSE null END) Nachname_M,
   MAX(CASE WHEN meta_key='adress' THEN meta_value ELSE null END) Adresse_M
FROM wp_usermeta
GROUP BY user_id

如果usermeta是類似的東西postmeta,它的索引效率很低。有關提高效率的指南,請參閱此內容。

引用自:https://dba.stackexchange.com/questions/188947