【发布时间】:2021-12-12 15:17:21
【问题描述】:
我正在制作一款已经拥有超过 10,000,000 名用户的自定义应用程序。
我必须创建一个从特定成员类型中提取用户的自定义查询。
问题是,如果我只想查看 20 个用户并进行分页,则需要很长时间才能将数据从数据库中取出,并且由于查询非常繁重,经常会出现严重错误。
如果我使用BP_User_Query(Buddypress 类)也会发生同样的情况,因为我的代码是基于它的。
最大的问题是 Buddypress member_type 已经被记录在 WP 术语中,并且通过复杂的关系到达。
这是我的查询:
SELECT
wp_users.*,
t_ex.name AS member_type,
( SELECT meta_value FROM wp_usermeta WHERE wp_usermeta.meta_key='first_name' AND wp_usermeta.user_id=wp_users.ID ) AS first_name,
( SELECT meta_value FROM wp_usermeta WHERE wp_usermeta.meta_key='last_name' AND wp_usermeta.user_id=wp_users.ID ) AS last_name,
( SELECT meta_value FROM wp_usermeta WHERE wp_usermeta.meta_key='nickname' AND wp_usermeta.user_id=wp_users.ID ) AS nickname,
( SELECT meta_value FROM wp_usermeta WHERE wp_usermeta.meta_key='description' AND wp_usermeta.user_id=wp_users.ID ) AS description,
( SELECT meta_value FROM wp_usermeta WHERE wp_usermeta.meta_key='last_update' AND wp_usermeta.user_id=wp_users.ID ) AS last_update,
( SELECT meta_value FROM wp_usermeta WHERE wp_usermeta.meta_key='wp_capabilities' AND wp_usermeta.user_id=wp_users.ID ) AS caps,
( SELECT meta_value FROM wp_usermeta WHERE wp_usermeta.meta_key='rich_editing' AND wp_usermeta.user_id=wp_users.ID ) AS rich_editing
FROM
wp_users
LEFT JOIN wp_term_relationships tr_ex ON tr_ex.object_id = wp_users.ID
LEFT JOIN wp_term_taxonomy tt_ex ON tt_ex.term_taxonomy_id = tr_ex.term_taxonomy_id
LEFT JOIN wp_terms t_ex ON t_ex.term_id = tt_ex.term_id
WHERE
1=1
AND
tt_ex.taxonomy = 'bp_member_type'
AND
t_ex.name = 'platformuser'
GROUP BY wp_users.ID
ORDER BY wp_users.display_name ASC
LIMIT 0, 20
有没有更好的解决方案,我可以在不给数据库带来如此困难的情况下获得所需的结果。
我要查找的参数位于t_ex.name,在我的情况下为'platformuser'
我认为问题出在组和顺序上:
...
GROUP BY wp_users.ID
ORDER BY wp_users.display_name ASC
...
但不知道为什么。我也需要那个。
【问题讨论】:
-
请提供
SHOW CREATE TABLE wp_term_relationships-- 它的索引可能很差。 (我知道 wp_postmeta 可以。)还提供wp_term_taxonomy、wp_users和wp_terms以防他们需要新索引。 -
WordPress 架构是 here 供您参考。
-
Mirabilu dicte,
wp_term_relationships上的索引很好。这是一个修改后的多对多连接表(带有term_order列)。
标签: mysql wordpress query-optimization buddypress