V2EX 10月13日 14:46
处理用户权限查询的数据库性能优化方案
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

在处理千万级数据量的业务表时,用户权限查询成为性能瓶颈。常见的权限需求包括查看用户自己创建的数据以及所属群组的数据。群组权限具有层级继承性,用户不仅能查看自己直接所属群组的数据,还能访问所有下级群组的数据。当权限逻辑复杂,如需要结合用户ID和群组层级权限进行查询时,简单的索引难以满足需求。本文探讨了应用层聚合、数据冗余以及引入中间件(如Elasticsearch)等常见解决方案,并寻求实际应用中的最佳实践。

🚦 **权限继承带来的查询挑战**:当用户权限包含“查看自己创建的数据”和“查看所属群组及其所有下级群组数据”时,SQL查询会变得复杂。例如,需要查询`project`表,同时满足`user_id = ?`或`group_id`在用户所属群组及其所有子群组的ID列表中。这种OR条件和子查询(或递归查询)在千万级数据量下,即使有复合索引(如`(group_id, user_id, created_at)`)也难以高效执行,尤其是在按创建时间倒序分页时。

💡 **应用层聚合与多索引策略**:一种解决方案是在应用层进行数据聚合。可以分别为`user_id`和`group_id`(包含所有层级ID)建立独立的索引,并在应用层执行UNION ALL操作,然后进行排序和分页。或者,为`user_id`建立索引,为`group_id`建立索引,并考虑为`group_id`的递归层级关系设计更优化的索引策略,但直接在SQL中处理层级查询仍然是难点。

🔗 **数据冗余与专用访问表**:另一种常见且有效的方法是引入数据冗余。可以创建一个“用户可访问数据表”,其中存储用户ID和他们有权访问的所有数据记录的ID(或相关信息)。在更新权限或数据时,同步更新此访问表。这样,查询列表时可以直接查询这个访问表,条件是`user_id = ?`,然后通过访问表关联回原始数据表进行排序和分页,显著提高查询效率。

🚀 **引入搜索引擎中间件**:对于极其复杂或对实时性要求极高的权限查询场景,引入Elasticsearch等搜索引擎是成熟的解决方案。可以将业务数据同步到Elasticsearch,并利用其强大的过滤、聚合和排序能力来处理复杂的权限逻辑。在Elasticsearch中,可以通过设置用户ID和其所有可访问的群组ID(通过预先计算或在索引时处理)作为文档的字段,实现高效的搜索和分页。

各位大佬,想请教一下这个关于查询用户拥有权限的数据的问题,感觉这个挺常见的需求

业务场景:

假设一个业务表,数据量在几千万级。需要为这个表提供一个列表展示页,要求按创建时间倒序分页。主要是权限问题导致查询慢: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`.idWHERE `group`.id IN (SELECT 用户关联的群组及其子群组 id)   OR user_id = 20ORDER BY project.created_at DESCLIMIT 10;

这时候 (group_id, user_id, created_at) 也不好使;

问了 AI ,说了几个方案:1 、应用层聚合/union user_id 和 group_id 的,建两个索引;2 、冗余一张 用户能访问数据的表,直接查这个表;3 、引入 es 之类的中间件;

想问一下实际大家是怎么处理的?

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

数据库 权限管理 SQL优化 性能调优 Elasticsearch 数据冗余 分页查询 层级权限
相关文章