您需要高效查询用户被授权的分级结构(D、E、F级别)并支持分页功能。这类层级授权查询在权限管理系统中很常见,但如果不优化容易导致性能问题。
假设您的授权表结构如下:
CREATE TABLE user_authorization (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
level_type ENUM('D', 'E', 'F') NOT NULL,
level_id INT NOT NULL,
grant_time DATETIME NOT NULL,
INDEX idx_user_level (user_id, level_type, level_id),
INDEX idx_level_type (level_type, level_id)
);
SELECT a.level_type, a.level_id, l.name AS level_name
FROM user_authorization a
JOIN level_data l ON a.level_type = l.level_type AND a.level_id = l.level_id
WHERE a.user_id = ?
ORDER BY a.level_type, a.level_id
LIMIT ?, ?;
SELECT a.level_type, a.level_id, l.name AS level_name
FROM (
SELECT level_type, level_id
FROM user_authorization
WHERE user_id = ?
ORDER BY level_type, level_id
LIMIT ?, ?
) a
JOIN level_data l ON a.level_type = l.level_type AND a.level_id = l.level_id;
对于频繁访问的授权数据,可以使用缓存: - Redis缓存用户的分级授权信息 - 设置合理的过期时间(如5-10分钟) - 当授权变更时主动清除缓存
-- 使用"记住上次位置"分页法(性能最佳)
SELECT a.level_type, a.level_id, l.name AS level_name
FROM user_authorization a
JOIN level_data l ON a.level_type = l.level_type AND a.level_id = l.level_id
WHERE a.user_id = ?
AND (a.level_type > ? OR (a.level_type = ? AND a.level_id > ?))
ORDER BY a.level_type, a.level_id
LIMIT ?;
确保有以下索引:
ALTER TABLE user_authorization ADD INDEX idx_user_level_paging (user_id, level_type, level_id);
方法 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
简单JOIN | 实现简单 | 大数据量性能差 | 小数据量 |
子查询分页 | 减少JOIN数据量 | 子查询可能影响性能 | 中等数据量 |
记住位置 | 最佳性能 | 实现复杂 | 大数据量分页 |
需要更具体的优化建议,请提供您的实际表结构和查询模式。