Skip to content

数据库索引设计

文档编号: SYS-DB-DES-003
版本: 1.0
日期: 2026-03-08
作者: 数据库架构师
状态: ✅ 已评审


一、概述

1.1 设计目标

  • 优化查询性能,减少全表扫描
  • 平衡读写性能,避免过度索引
  • 支持业务关键查询场景
  • 控制索引存储空间

1.2 设计原则

  1. 选择性原则: 优先在高选择性字段上创建索引
  2. 最左前缀原则: 联合索引按查询条件顺序排列
  3. 覆盖索引原则: 常用查询尽量使用覆盖索引
  4. 避免冗余: 避免重复索引和不必要的索引
  5. 控制数量: 单表索引不超过5个

二、索引分类

2.1 主键索引 (Primary Key)

所有表的主键自动创建聚簇索引。

表名主键字段索引类型
sys_userid聚簇索引
sys_roleid聚簇索引
sys_permissionid聚簇索引
sys_menuid聚簇索引
sys_deptid聚簇索引
sys_positionid聚簇索引
sys_employeeid聚簇索引
sys_tenant_configid聚簇索引
sys_web_configid聚簇索引
sys_business_configid聚簇索引
sys_dict_typeid聚簇索引
sys_dict_itemid聚簇索引
sys_operation_logid聚簇索引
sys_login_logid聚簇索引

2.2 唯一索引 (Unique Index)

表名字段索引名说明
sys_userusernameuk_username用户名唯一
sys_useremailuk_email邮箱唯一
sys_userphoneuk_phone手机号唯一
sys_useremployee_nouk_employee_no员工编号唯一
sys_rolerole_codeuk_role_code角色编码唯一
sys_permissionperm_codeuk_perm_code权限编码唯一
sys_deptdept_codeuk_dept_code部门编码唯一
sys_positionposition_codeuk_position_code岗位编码唯一
sys_employeeemployee_nouk_employee_no员工编号唯一
sys_employeeuser_iduk_user_id用户关联唯一
sys_tenant_configtenant_codeuk_tenant_code租户编码唯一
sys_dict_typedict_codeuk_dict_code字典编码唯一

2.3 普通索引 (Normal Index)

用户管理域

表名索引名字段说明
sys_useridx_dept_iddept_id部门查询
sys_useridx_tenant_idtenant_id租户查询
sys_useridx_create_timecreate_time时间范围查询
sys_user_roleidx_user_iduser_id用户角色查询
sys_user_roleidx_role_idrole_id角色用户查询
sys_user_roleidx_tenant_idtenant_id租户查询
sys_user_deptidx_user_iduser_id用户部门查询
sys_user_deptidx_dept_iddept_id部门用户查询
sys_user_deptidx_tenant_idtenant_id租户查询

权限管理域

表名索引名字段说明
sys_roleidx_tenant_idtenant_id租户查询
sys_roleidx_statusstatus状态查询
sys_role_permissionidx_role_idrole_id角色权限查询
sys_role_permissionidx_permission_idpermission_id权限角色查询
sys_permissionidx_parent_idparent_id父权限查询
sys_permissionidx_resource_typeresource_type资源类型查询
sys_menuidx_parent_idparent_id父菜单查询
sys_menuidx_tenant_idtenant_id租户查询
sys_menuidx_statusstatus状态查询

组织管理域

表名索引名字段说明
sys_deptidx_parent_idparent_id父部门查询
sys_deptidx_tenant_idtenant_id租户查询
sys_deptidx_leader_idleader_id负责人查询
sys_positionidx_tenant_idtenant_id租户查询
sys_positionidx_statusstatus状态查询
sys_employeeidx_dept_iddept_id部门查询
sys_employeeidx_position_idposition_id岗位查询
sys_employeeidx_tenant_idtenant_id租户查询

系统配置域

表名索引名字段说明
sys_tenant_configidx_tenant_idtenant_id租户查询
sys_tenant_configidx_statusstatus状态查询
sys_web_configidx_tenant_idtenant_id租户查询
sys_business_configidx_tenant_idtenant_id租户查询
sys_dict_typeidx_tenant_idtenant_id租户查询
sys_dict_itemidx_dict_type_iddict_type_id字典类型查询
sys_dict_itemidx_tenant_idtenant_id租户查询

审计日志域

表名索引名字段说明
sys_operation_logidx_user_iduser_id用户查询
sys_operation_logidx_operation_typeoperation_type操作类型查询
sys_operation_logidx_create_timecreate_time时间范围查询
sys_operation_logidx_tenant_idtenant_id租户查询
sys_login_logidx_user_iduser_id用户查询
sys_login_logidx_usernameusername用户名查询
sys_login_logidx_create_timecreate_time时间范围查询
sys_login_logidx_tenant_idtenant_id租户查询

三、联合索引设计

3.1 关系表联合索引

表名索引名字段组合说明
sys_user_roleuk_user_roleuser_id, role_id唯一约束
sys_user_deptuk_user_deptuser_id, dept_id唯一约束
sys_role_permissionuk_role_permissionrole_id, permission_id唯一约束

3.2 复合查询索引

表名索引名字段组合适用场景
sys_useridx_tenant_statustenant_id, status租户+状态查询
sys_operation_logidx_tenant_timetenant_id, create_time租户日志时间查询
sys_login_logidx_tenant_timetenant_id, create_time租户登录时间查询

四、索引优化建议

4.1 避免索引失效

场景说明建议
函数操作WHERE UPPER(username) = 'xxx'避免在索引字段上使用函数
类型转换WHERE id = '123' (id为数字)确保类型匹配
前导模糊WHERE username LIKE '%xxx'避免前导通配符
OR条件WHERE a = 1 OR b = 2考虑使用UNION
不等于WHERE status != 0可能不走索引
NULL判断WHERE col IS NULL确保字段有NOT NULL约束

4.2 索引维护

sql
-- 查看索引使用情况
SELECT 
    TABLE_NAME,
    INDEX_NAME,
    CARDINALITY
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'db_system'
ORDER BY TABLE_NAME, INDEX_NAME;

-- 查看表索引大小
SELECT 
    TABLE_NAME,
    INDEX_NAME,
    ROUND(SUM(DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS 'Size(MB)'
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'db_system'
GROUP BY TABLE_NAME;

4.3 索引监控

sql
-- 开启慢查询日志
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;

-- 查看慢查询
SELECT * FROM mysql.slow_log 
WHERE start_time > DATE_SUB(NOW(), INTERVAL 1 DAY)
ORDER BY query_time DESC;

五、索引统计

表数量索引总数平均索引数
用户管理域3124
权限管理域4153.75
组织管理域3113.67
系统配置域5142.8
审计日志域284
总计17603.53

六、审核记录

6.1 审核状态

审核项状态审核人审核日期
主键索引设计✓ 通过技术负责人2026-03-08
外键索引设计✓ 通过技术负责人2026-03-08
业务索引设计✓ 通过技术负责人2026-03-08
联合索引设计✓ 通过技术负责人2026-03-08

6.2 签字确认

角色姓名签字日期
编制人数据库架构师_____________2026-03-08
审核人技术负责人_____________2026-03-08
批准人项目经理_____________2026-03-08

七、修订记录

版本日期作者变更内容
1.02026-03-08数据库架构师初始版本,创建索引设计文档

Released under the MIT License.