我有几年前为会员网站撰写的查询。我不是非常精通使用$ 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 }
*注意:我正在分页...没有在一个页面上显示所有结果。
答案 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";
当您为大量用户打包时,您会陷入困境,并且会产生一些不可避免的低效率。但这应该比你拥有的要好。