【发布时间】:2016-07-27 10:50:04
【问题描述】:
我正在尝试获取按上次活动排序并分页的“活跃”用户列表。我最初将它用作基本连接,但是当我添加了几十万测试用户时,查询会随着分页而变得越来越长,并且在您到达最后一页时会花费绝对时间。
然后我嵌套连接以解决速度问题,但由于外部查询仅返回具有偏移量和限制的活动用户,然后才能应用订单,因此我无法正确排序结果。
这是当前查询;
$sql = "SELECT * FROM (
SELECT roles_users.*, users.last_active FROM roles_users, users
WHERE roles_users.role_id = '2'
LIMIT $offset, $limit
) AS role
LEFT JOIN users ON users.id = role.user_id
WHERE
users.f_name IS NOT NULL
AND users.city IS NOT NULL
AND users.gender IS NOT NULL
AND users.date_of_birth IS NOT NULL
ORDER BY users.last_active DESC";
这样做的最佳方法是什么,以使其高效运行并正确排序?
编辑
roles_users 的表结构;
#-- Field -- Type ----------- Null -- Key --- Foreign key --#
#
# user_id int(10) unsigned No primary users.id
# role_id int(10) unsigned No primary user_roles.id
#
#############################################################
users 表非常广泛,所以我不会放在这里。虽然它是相当标准的。
users.last_active 上有一个索引。
【问题讨论】:
-
注意
LEFT JOIN y ... WHERE y ... [IS NOT NULL]和INNER JOIN y ON...一样
标签: mysql join sql-order-by