wp_usermeta查询在加载前挂起几秒钟

时间:2014-02-17 22:14:22

标签: mysql sql wordpress wpdb

我有几年前为会员网站撰写的查询。我不是非常精通使用$ wpdb(或一般的MYSQL代码)来编写自定义查询,并且该网站已经增长了很多。现在wp_usermeta表中有大约150k行,并且在加载之前,运行查询的页面会挂起几秒钟。我希望随着时间的推移,这会变得更糟,网站会吸引更多用户。

任何有关如何加快查询速度的帮助都将非常感激。

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$limit = 15;
$offset = ($paged - 1) * $limit;
$key = 'first_name';

$sql = "SELECT SQL_CALC_FOUND_ROWS {$wpdb->users}.* FROM {$wpdb->users}
INNER JOIN {$wpdb->usermeta} wp_usermeta ON ({$wpdb->users}.ID = wp_usermeta.user_id)
WHERE 1=1
    AND wp_usermeta.meta_key = '$key'
    AND wp_usermeta.meta_value <> ''
    AND wp_users.user_registered < '2014-01-30'
ORDER BY wp_usermeta.meta_value ASC
LIMIT $offset, $limit";

$members = $wpdb->get_results($sql);

$found_rows = $wpdb->get_var("SELECT FOUND_ROWS();");

foreach ($members as $member) { // display member info here }

*注意:我正在分页...没有在一个页面上显示所有结果。

1 个答案:

答案 0 :(得分:0)

这里有几件事。

首先,您似乎按用户名字排序,但没有检索或显示它。这有点奇怪。您可以通过wp_users.user_nicename订购,并省略与wp_usermeta的连接。这将节省一些加入时间。该列的值由用户在其个人资料中设置,并反映她想要知道的身份。因此,它很可能是一个合适的订购栏。

其次,您正在检索wp_users中的所有列(*)。你能避免全部检索它们,而是列举你真正需要的那个吗?这将节省分拣时间。

您的查询将成为此内容。

 $sql = "SELECT SQL_CALC_FOUND_ROWS 
                id, user_login, user_nicename, etc etc
           FROM {$wpdb->users}
          WHERE user_registered < '2014-01-30'
          ORDER BY user_nicename ASC
          LIMIT $offset, $limit";

当您为大量用户打包时,您会陷入困境,并且会产生一些不可避免的低效率。但这应该比你拥有的要好。