Optimize RBAC org tree loading

This commit is contained in:
wren
2026-05-12 16:53:22 +08:00
parent cd21a82168
commit d47f499e57
6 changed files with 311 additions and 145 deletions
@@ -0,0 +1,36 @@
-- ============================================================================
-- sso_users 组织树查询索引补丁
-- 用途:
-- 1. 优化 /api/admin/users/organizations/tree 的分层懒加载查询
-- 2. 重点覆盖 tenant / dep / org / ou_id 四类过滤路径
-- 注意:
-- 1. 该脚本适合已存在 sso_users 表的环境增量执行
-- 2. 如果正式库较大,建议低峰执行;如需 CREATE INDEX CONCURRENTLY,请拆成单条执行
-- ============================================================================
BEGIN;
-- 根节点:按地区 + 有效用户状态枚举租户
CREATE INDEX IF NOT EXISTS idx_sso_users_active_area_tenant
ON sso_users(status, deleted_at, area, tenant_name);
-- 租户节点:按地区 / 租户 枚举部门,兼容 dep_name / dep_short_name
CREATE INDEX IF NOT EXISTS idx_sso_users_active_tenant_dep_expr
ON sso_users(status, deleted_at, tenant_name, (COALESCE(dep_name, dep_short_name, '')));
-- 部门节点:按租户 + 部门 枚举组织
CREATE INDEX IF NOT EXISTS idx_sso_users_active_tenant_dep_ou_name
ON sso_users(status, deleted_at, tenant_name, (COALESCE(dep_name, dep_short_name, '')), ou_name);
-- 叶子节点:按地区快速命中组织名称 / 组织ID
CREATE INDEX IF NOT EXISTS idx_sso_users_active_area_ou_name
ON sso_users(status, deleted_at, area, ou_name);
CREATE INDEX IF NOT EXISTS idx_sso_users_active_area_ou_id
ON sso_users(status, deleted_at, area, ou_id);
-- 部门展开时若只按 area + department 过滤,也给表达式索引
CREATE INDEX IF NOT EXISTS idx_sso_users_active_area_dep_expr
ON sso_users(status, deleted_at, area, (COALESCE(dep_name, dep_short_name, '')));
COMMIT;
@@ -50,6 +50,18 @@ CREATE INDEX IF NOT EXISTS idx_sso_users_ou_id ON sso_users(ou_id);
CREATE INDEX IF NOT EXISTS idx_sso_users_is_leader ON sso_users(is_leader);
CREATE INDEX IF NOT EXISTS idx_sso_users_mq_person ON sso_users(mq_person_uuid);
CREATE INDEX IF NOT EXISTS idx_sso_users_mq_account ON sso_users(mq_account_uuid);
CREATE INDEX IF NOT EXISTS idx_sso_users_active_area_tenant
ON sso_users(status, deleted_at, area, tenant_name);
CREATE INDEX IF NOT EXISTS idx_sso_users_active_area_dep_expr
ON sso_users(status, deleted_at, area, (COALESCE(dep_name, dep_short_name, '')));
CREATE INDEX IF NOT EXISTS idx_sso_users_active_area_ou_name
ON sso_users(status, deleted_at, area, ou_name);
CREATE INDEX IF NOT EXISTS idx_sso_users_active_area_ou_id
ON sso_users(status, deleted_at, area, ou_id);
CREATE INDEX IF NOT EXISTS idx_sso_users_active_tenant_dep_expr
ON sso_users(status, deleted_at, tenant_name, (COALESCE(dep_name, dep_short_name, '')));
CREATE INDEX IF NOT EXISTS idx_sso_users_active_tenant_dep_ou_name
ON sso_users(status, deleted_at, tenant_name, (COALESCE(dep_name, dep_short_name, '')), ou_name);
COMMENT ON TABLE sso_users IS '用户主表:认证身份、组织信息、地区隔离基础字段统一沉淀在这里';
COMMENT ON COLUMN sso_users.sub IS '统一身份唯一标识,OAuth / SSO 主键';