业务场景:
假设一个业务表,数据量在几千万级。
需要为这个表提供一个列表展示页,要求按创建时间倒序分页。
主要是权限问题导致查询慢:
1 、用户可以查看自己创建的数据。
2 、用户可以查看自己所属群组的数据。
3 、群组的权限是可继承的、层级的:如果一个用户属于某个上级群组,那么他自动拥有查看其所有下级、下下级...群组内数据的权限。
问题:
如果权限简单,比如只看自己的数据,查询非常简单:
WHERE user_id = ? ORDER BY create_time DESC LIMIT N
这种查询用索引就好解决。
但如果加入群组权限,查询的逻辑就变成了:
SELECT * FROM a_large_table WHERE user_id = ? OR group_id IN (用户所属群组以及所有下级群组的 ID 列表) ORDER BY create_time DESC LIMIT N
这个查询就比较慢了
比如假定结构是这样:

查询就变成了
SELECT *
FROM project
JOIN `group` ON project.group_id = `group`.id
WHERE `group`.id IN (SELECT 用户关联的群组及其子群组 id)
OR user_id = 20
ORDER BY project.created_at DESC
LIMIT 10;
这时候 (group_id, user_id, created_at) 也不好使;
问了 AI ,说了几个方案:
1 、应用层聚合/union user_id 和 group_id 的,建两个索引;
2 、冗余一张 用户能访问数据的表,直接查这个表;
3 、引入 es 之类的中间件;
想问一下实际大家是怎么处理的?