Subject
表:
Id int
DepartmentId int
GroupId int
SchoolId int
Name varchar(255)
查询
查询#1
SELECT *
FROM [Subject] t1, [Department] t2
WHERE t1.DepartmentId = t2.DepartmentId
查询#2
SELECT *
FROM [Subject] t1, [Group] t2, [Department] t3
WHERE t1.GroupId = t2.GroupId
AND t1.SchoolId = t3.DepartmentId
查询#3
SELECT *
FROM [Subject] t1, [Group] t2, [School] t3
WHERE t1.GroupId = t2.GroupId
AND t1.SchoolId = t3.SchoolId
我应该为表“subject”创建3个索引,还是仅仅一个就足够了?
解决方案1
创建一个索引:departmentId + GroupId + SchoolId
解决方案2
创建三个索引:
DepartmentId
用于存储过程1。DepartmentId + GroupId
用于存储过程2。GroupId + SchoolId
用于存储过程3。非常感谢你!
答案 0 :(得分:2)
您的解决方案#1将不用于查询#3 - 如果您在(departmentId, groupId, SchoolId)
上有复合索引,那么您的查询#3肯定无法使用它(因为它不使用departmentId
作为标准)。如果您使用所有n个最左侧的列,则复合索引仅有效。
您可以做的事情是您的解决方案之间的混合:
创建两个索引:
DepartmentId, GroupId
上的一个索引,对于查询#1和#2 GroupId, SchoolId
上的另一个索引
但要谨慎:不要过度索引!太多指数比没有指数差。
运行您的系统 - 观察它的性能。如果它足够快 - 快乐,去度假!
只有不足够快时,才能使用性能分析来查找性能最差的查询,并添加索引来处理这些查询。不要只为每个查询添加索引 - 在插入,更新和删除数据时,保持这些索引不错,闪亮也会降低性能。