V2EX 10月13日 15:01
大型业务表用户权限查询优化
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文探讨了在处理千万级数据量的业务表时,如何高效地为用户提供列表展示功能,并解决因复杂权限逻辑(用户自有数据、所属群组数据、群组层级继承权限)导致的查询性能瓶颈。当查询条件涉及用户ID和其所属群组及其所有下级群组ID时,传统的索引难以满足性能要求。文章提出了应用层聚合/union、数据冗余表以及引入Elasticsearch等中间件的几种解决方案,旨在寻求实际生产环境中处理此类常见权限查询问题的有效方法。

🚦 **权限逻辑复杂是性能瓶颈所在**:在千万级数据量的业务表中,用户权限通常包含查看自己创建的数据、所属群组数据,以及继承的上级群组数据。这种层级化的权限继承使得SQL查询变得复杂,特别是当需要同时满足用户ID和其所有下级群组ID的条件时,简单的索引(如(group_id, user_id, created_at))难以奏效,导致查询缓慢。

💡 **应用层聚合/Union与双索引方案**:一种常见思路是在应用层对用户ID和其所有可访问的群组ID进行聚合或使用UNION操作,并为这两类查询分别建立优化的索引。例如,一个索引可能侧重于`user_id`,另一个则可能侧重于`group_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 性能调优 群组权限 数据库索引 数据冗余 Application-level aggregation Database Performance Permission System Large Datasets SQL Indexing Data Redundancy
相关文章