V2EX 10月13日 15:16
用户权限查询优化:千万级数据表下的挑战与实践
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

在处理千万级数据量的业务表时,如何高效地为用户提供列表展示页,并满足其查看自己创建数据及所属群组数据的权限需求,是一个常见的技术难题。特别是当群组权限具有层级继承性时,传统的基于 `user_id` 或 `group_id` 的索引查询将难以满足性能要求。本文探讨了在此场景下,可能遇到的性能瓶颈,并介绍了应用层聚合、数据冗余以及引入中间件(如 Elasticsearch)等几种常见的解决方案,以期为实际开发提供参考。

🎯 **权限查询的挑战与性能瓶颈**:当用户需要查看自己创建的数据以及其所属群组(含所有层级下级群组)的数据时,查询条件会变得复杂,涉及 `user_id` 和一个动态生成的 `group_id` 列表。对于千万级数据量的表,直接使用 `OR` 条件进行查询(例如 `WHERE user_id = ? OR group_id IN (...)`)会显著降低查询效率,即使有复合索引也难以优化,因为它需要扫描大量数据并进行复杂的条件匹配。

💡 **应用层聚合与索引优化**:一种常见的方法是在应用层进行数据聚合。可以为 `user_id` 和 `group_id` 分别建立高效的索引,然后在应用代码中执行两次查询(一次查询用户自己的数据,一次查询用户所属群组的数据),最后在内存中合并结果并进行分页。另一种优化思路是构建一个包含用户直接关联的群组 ID 以及所有下级群组 ID 的列表,并将其与用户 ID 一起构建复合索引,但这在群组层级非常深或变化频繁时,维护成本较高。

🔄 **数据冗余与中间件方案**:为了进一步提升查询性能,可以考虑数据冗余。例如,维护一个额外的表,记录用户能够访问的所有数据的 `user_id` 和 `data_id` 映射关系。每次权限变更时同步更新此表,查询时直接从该映射表中获取可访问的 `data_id` 列表。更进一步,可以引入 Elasticsearch 等全文搜索引擎。通过将业务数据同步到 ES,并利用其强大的索引和搜索能力,可以针对用户 ID 和群组 ID 进行高效的聚合和过滤查询,实现近乎实时的搜索和列表展示,尤其适合复杂的权限过滤和排序需求。

🛠️ **实际应用中的权衡**:在实际处理此类问题时,需要根据具体业务场景、数据量增长趋势、性能要求以及开发维护成本进行权衡。简单的场景下,应用层聚合可能已足够;而对于对性能要求极高、权限关系复杂的系统,数据冗余或引入 Elasticsearch 等中间件将是更优的选择。关键在于理解不同方案的优缺点,并选择最适合当前需求的策略。

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

业务场景:

假设一个业务表,数据量在几千万级。需要为这个表提供一个列表展示页,要求按创建时间倒序分页。主要是权限问题导致查询慢: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 数据架构 千万级数据 分页查询 群组权限 Database Performance Optimization Permission Management SQL Elasticsearch Data Architecture Large Datasets Pagination Group Permissions
相关文章